原子性:
对象类型:
对象地址原子读写,线程安全
并发读不可变状态,线程安全
并发读写可变状态,非线程线程
基本类型:
int,char数值读写,线程安全
long,double高低位,非线程安全(32位系统)
i++等组合操作,非线程安全
可见性:
final
初始化final字段确保可见性
volatile
读写volatile字段确保可见性
synchronized
同步块内读写字段确保可见性
happen before
遵守happen before次序可见性
lock
lock确保可见性,但重入的第二个锁应该不具有该特性
可排序:
Happen Before 法则
程序次序法则
如果A一定在B之前发生,则happen before,
监视器法则
对一个监视器的解锁一定发生在后续对同一监视器加锁之前
Volatie变量法则
写volatile变量一定发生在后续对它的读之前
线程启动法则
Thread.start一定发生在线程中的动作之前
线程终结法则
线程中的任何动作一定发生在括号中的动作之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)
中断法则
一个线程调用另一个线程的interrupt一定发生在另一线程发现中断之前。
终结法则
一个对象的构造函数结束一定发生在对象的finalizer之前
传递性
A发生在B之前,B发生在C之前,A一定发生在C之前。
https://www.ibm.com/developerworks/java/library/j-jtp0618/index.html
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering