Volatile原子性分析

Volatile原子性分析_第1张图片
Volatile原子性可通过下面例子来说明
Volatile原子性分析_第2张图片
每个线程都对共享变量num做了1000++,一共有10个线程
多次运行上面程序得到的结果num<=10000,而不是理想中的num=10000
Volatile原子性分析_第3张图片
Volatile原子性分析_第4张图片
Volatile原子性分析_第5张图片
那究竟是什么原因呢?

  • 通过下图说明,假设线程1和线程2同时从主内存将num变量read读取出来,再load载入工作内存,
    use使用线程执行代码,线程1和线程2都对num++操作,此时线程1和线程2的num值都为1,
    线程1和线程2都对变量进行assign赋值操作,更改工作内存里num的值为1,此时假设线程1先对
    num进行store存储并写入主内存, 线程1对缓存行lock加锁,因为num被volatile修饰,
    使用MESI缓存一致性协议,线程2 cpu总线嗅探机制监听到了,线程2就会把工作内存里num的值
    设为失效状态,此时线程2原先做的num++操作就会丢失,然后线程2会重新从主内存read数据,
    此时主内存中的num值已被线程1修改为1,线程2再load载入工作内存,use使用线程执行代码,
    num就变成2,最终两个线程做了3次num++,而num值为2,原因是线程2有一次操作失效了,
    故假设线程1和线程2各执行1000次num++,那么num的值应该小于或等于2000

Volatile原子性分析_第6张图片


你可能感兴趣的:(Volatile原子性分析)