Java内存模型学习
内存模型
Java内存模型主要由JMM控制,JMM决定了一个线程对共享变量的写入何时对另一个线程可见。
JMM定义了线程和主内的抽象关系:线程的共享变量存在主存,每一个线程都有私有的本地内存。
指令重排序
编译器和处理器常常会对指令进行重排序
内存屏障
JMM的处理器的重排序规则要求对Java编译器在生成指令序列时,插入特定的内存屏障,禁止指令重排序来保证内存一致性。
Happens-before 规则
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。
as-if-serial语义
as-if-serial语义的意思是:不管怎么重排序,单线程的程序执行结果不能被改变。
顺序一致性内存模型
1 一个线程中的所有操作必须按照程序的顺序来执行
2 所有线程都只能看到一个单一的操作执行顺序,在顺序一致性的内存模型中,每一个操作都必须原子性执行且立即对所有线程可见。
volitale的内存语义
当声明一个共享变量为volitale后,对这个变量的读写将会很特别。
- 可见性
对一个volatile变量的读,总是能看到任意线程对这个volitale变量的写入 - 原子性
对任意单个volitale变量的读/写具有原子性,但类似volitale++这种复合操作不具有原子性
volitale对应的内存语义:
当写一个volitale变量时,JMM会把该线程对应的本地内存中的共享变量的值刷新到主内存。
final域的内存语义
- 1 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能被重排序
- 2初次读一个包含final域的对象的引用,与随后初次读到这个final域,这两个操作之间不能重排序
参考资料:
Java并发编程的艺术