JVM内存模型
- 原子性
- 通过锁或者 CAS 无锁来保证
- 可见性
- 通过锁或者 volatile 来保证
- 有序性
- as-if-serial 保证单线程内程序的执行结果不会变
- hanppens-before 保证正确同步的多线程程序执行结果不会变
- 程序顺序规则:一个线程中的每个操作,happens-before 于该线程中的任意后续操作。
- 监视器锁规则:对一个锁的解锁,happens-before 于随后对这个锁的加锁。
- volatile 变量规则:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读。
- 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。
- start()规则:如果线程 A 执行操作 ThreadB.start()(启动线程 B),那么 A 线程的 ThreadB.start()操作 happens-before 于线程 B 中的任意操作。
- join()规则:如果线程 A 执行操作 ThreadB.join()并成功返回,那么线程 B 中的任意操作 happens-before 于线程 A 从 ThreadB.join()操作成功返回。
- 程序中断规则:对线程 interrupted()方法的调用先行于被中断线程的代码检测到中断时间的发生。
- 对象 finalize 规则:一个对象的初始化完成(构造函数执行结束)先行于发生它的 finalize()方法的开始。
- 都是在保证程序结果不变的情况下尽可能地提高程序效率
Simple is Awesome