- Java内存模型(JMM)中的三大问题
- 可见性:多个线程访问共享变量,若其中一个线程对共享变量进行修改,那么共享变量的修改对其他线程可以立马看到修改后的值
- 原子性:一个操作或操作要么全部执行完成,要么都不执行
- 有序性:即程序执行的顺序按照代码的先后顺序执行
- volatile关键字
- java关键字,可以理解为轻量锁(只能解决java内存模型中的两大问题)
- 两层语义
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
- 禁止进行指令重排序
- volatile关键字实现原理
- 可见性:
//线程1 boolean stop = false; while(!stop){ doSomething(); }
//线程2 stop = true;
上面两段代码两个线程,线程1先启动后,会将共享变量复制一份到自己的内存栈中,此时线程2启动也将变量复制到自己私有内存栈中,但线程2在更改变量后并未将数据写回到主存中,转而去执行别的任务,此时线程1无法感知到线程2的变量修改操作。 使用volatile关键字后,线程2修改共享变量后,会通知其他线程的工作内存缓存变量失效(即cpu的多级缓存失效),由于工作内存中的变量已失效,当前线程不得不再从主内存重新读取共享变量
-
禁止指令重排:
int x = 0; //① int y = 0; //② x = x + 1; //③ y = x + 5; //④
以上代码在编译、运行时都可能进行指令重排,由于③依赖②,④依赖于①、②,所以可能出现以下顺序
①--②--③--④、②--①--③--④、①--②--④--③、②--①--④--③、①--③--②--④ ,其中①--②--④--③、②--①--④--③这两种重排序会影响最后结果- 内存屏障(参考https://www.cnblogs.com/chenyangyao/p/5269622.html)
- 内存访问重排序和Java内存模型
- 可见性:
06-02
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交