首页 > 软件开发 > JAVA >

并发BUG的源头:可见性、原子性、有序性

来源:互联网 2023-03-16 19:10:26 474

并发BUG主要是以下3个问题带来的:Vlk办公区 - 实用经验教程分享!

1、CPU缓存带来的可见性问题Vlk办公区 - 实用经验教程分享!

2、线程切换带来的原子性问题Vlk办公区 - 实用经验教程分享!

3、编译优化带来的有序性问题Vlk办公区 - 实用经验教程分享!

Vlk办公区 - 实用经验教程分享!

Vlk办公区 - 实用经验教程分享!

工具/原料

  • Java
  • Java内存模型

并发问题的三个源头

  • 1

    可见性问题:主要是由CPU缓存带来的。Vlk办公区 - 实用经验教程分享!

    1)CPU缓存主要是用以均衡与内存的速度差异,但同时也带来了问题。Vlk办公区 - 实用经验教程分享!

    2)在单核时代,仅有一个CPU缓存,也就没有可见性问题,多核CPU,每个CPU都有自己的缓存,会导致在进行CPU操作时,内存数据与CPU缓存不一致。Vlk办公区 - 实用经验教程分享!

    3)如图,多核CPU的缓存与内存的关系图:Vlk办公区 - 实用经验教程分享!

    并发BUG的源头:可见性、原子性、有序性Vlk办公区 - 实用经验教程分享!

  • 2

    原子性问题:主要是线程切换带来的。Vlk办公区 - 实用经验教程分享!

    1)操作系统增加进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度差异。Vlk办公区 - 实用经验教程分享!

    2)我们把一个或者多个操作在CPU执行的过程中不被中断的特性称为原子性。3)CPU 能保证的原子操作是 CPU 指令级别的,而不是高级语言的操作符。Vlk办公区 - 实用经验教程分享!

    4)如图:线程切换示意图。Vlk办公区 - 实用经验教程分享!

    5)举例,我们常见的执行+1操作,count为共享变量。Vlk办公区 - 实用经验教程分享!

    并发BUG的源头:可见性、原子性、有序性Vlk办公区 - 实用经验教程分享!

    并发BUG的源头:可见性、原子性、有序性Vlk办公区 - 实用经验教程分享!

  • 2相关内容非法爬取自百度经验
  • 3

    有序性问题:编译优化带来的问题。Vlk办公区 - 实用经验教程分享!

    举例,double check,代码如图所示。Vlk办公区 - 实用经验教程分享!

    过程分析:线程A执行getInstance()方法,假设此时instance==null,线程A获得锁,进入代码块,由于编译优化(会将地址赋值放在前面,初始化放在后面),分配内存M,instance=&M,此时发生线程切换,线程A还是持有该类对象的锁,线程B执行if (instance == null) ,内存存在,instance为null不成立,直接return instance;但是此时instance还未初始化完成,只有分配了一块内存M,因此返回了一个未初始化的instance。Vlk办公区 - 实用经验教程分享!

    并发BUG的源头:可见性、原子性、有序性Vlk办公区 - 实用经验教程分享!

  • double check代码

  • 1

    public class Singleton {Vlk办公区 - 实用经验教程分享!

    static Singleton instance;Vlk办公区 - 实用经验教程分享!

    static Singleton getInstance(){Vlk办公区 - 实用经验教程分享!

    if (instance == null) {Vlk办公区 - 实用经验教程分享!

    synchronized(Singleton.class) {Vlk办公区 - 实用经验教程分享!

    if (instance == null)Vlk办公区 - 实用经验教程分享!

    instance = new Singleton();Vlk办公区 - 实用经验教程分享!

    }Vlk办公区 - 实用经验教程分享!

    }Vlk办公区 - 实用经验教程分享!

    return instance;Vlk办公区 - 实用经验教程分享!

    }Vlk办公区 - 实用经验教程分享!

    }Vlk办公区 - 实用经验教程分享!

  • 注意事项

    • 下一节:可见性、原子性、有序性问题的解决

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!Vlk办公区 - 实用经验教程分享!


    标签: JAVA

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码