JMM
1、内存模型的抽象。
本地内存是JMM的一个抽象概念,并不是真实存在,它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。
2、内存可见性问题?
?
3、重排序
编译器优化重排序 | 编译器再不改变单线程程序语义的前提下,可重新安排语句执行顺序。 |
指令级并行重排序 | 现代处理器采用了指令并行技术,来将多条指令重叠执行,如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。 |
内存系统重排序 | 由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是乱序执行。 |
4、内存屏障指令。
5、happens-before
6、顺序一致性
7、volatile 变量
volatile 变量
-
- 可见性:对于volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
- 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这样的复合操作不具有原子性。
volatile的读-写内存语义
-
- 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存。
- 当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。
8、锁(LOCK)
- 锁释放与volatile写有相同的内存语义。
- 锁获取与volatile读有相同的内存语义。
9、final 域
还在学习中,还望各位多多指点指点。