共计 402 个字符,预计需要花费 2 分钟才能阅读完成。
深刻解析 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 又再次写入了主内存,主内存的值被笼罩,呈现了失落写值;
正文完