当前位置: 首页 > 后端技术 > Java

volatile关键字深入解析

时间:2023-04-01 15:56:16 Java

volatile关键字深入解析为什么volatile不保证原子性?这是因为num++在多线程下不是线程安全的。num++方法编译成字节码后,分为以下三个步骤:从主存中拷贝i的值,拷贝到CPU的工作内存中。CPU取工作内存中的值,然后执行i++操作,完成后刷新到工作内存中。将工作内存中的值更新到主内存中。本来,线程1在自己的工作空间里把num改成1,写回主存。由于内存可见性,主存通知线程23,num=1;thread2通过变量的拷贝复制了num和++,num=2;再次写入主存,通知线程3,num=2,线程3通过变量copy复制num和++,num=3,num=3;写1时,暂停。线程2将1写入主存。这时候应该通知其他线程,把主存的值改成1。由于线程运行速度极快,其他线程还没有通知到,所以刚才挂了。线程1再次向主存写入num=1,主存的值被覆盖,写入的值出现丢失;