深刻解析volatile关键字
为什么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 又再次写入了主内存,主内存的值被笼罩,呈现了失落写值;