深入解析volatile关键字

  1. 为什么volatile不保证原子性?
    是因为num++在多线程下是非线程安全的。 num++方法编译成字节码后,分为以下三步运行的:

    • 从主存中复制 i 的值并复制到 CPU 的工作内存中。
    • CPU 取工作内存中的值,然后执行 i++操作,完成后刷新到工作内存。
    • 将工作内存中的值更新到主存。
    • 原本线程1在自己的工作空间中将num改为1,写回主内存,主内存由于内存可见性,通知线程2 3,num=1;线程2通过变量的副本拷贝,将num拷贝并++,num=2;再次写入主内存通知线程3,num=2,线程3通过变量的副本拷贝,将num拷贝并++,num=3; 然而 多线程竞争调度的原因,1号线程刚刚要写1的时候被挂起,2号线程将1写入主内存,此时应该通知其他线程,主内存的值更改为1,由于线程操作极快,还没有通知到其他线程,刚才被挂起的线程1 将num=1 又再次写入了主内存,主内存的值被覆盖,出现了丢失写值;

不熄炎
6 声望2 粉丝

« 上一篇
Mysql 学习总结
下一篇 »
JAVA并发笔记