如何让多线程之间,对象的状态对于各线程的“可视性”是顺序一致的:ConcurrentHashMap 使用了 happens-before 规则来实现。 happens-before规则(摘取自 JAVA 并发编程):
- 程序次序法则:线程中的每个动作A都 happens-before 于该线程中的每一个动作B,其中,在程序中,所有的动作B都能出现在A之后。
- 监视器锁法则:对一个监视器锁的解锁 happens-before 于每一个后续对同一监视器锁的加锁。
- volatile 变量法则:对 volatile 域的写入操作 happens-before 于每一个后续对同一个域的读写操作。
- 线程启动法则:在一个线程里,对 Thread.start 的调用会 happens-before 于每个启动线程的动作。
- 线程终结法则:线程中的任何动作都 happens-before 于其他线程检测到这个线程已经终结、或者从 Thread.join 调用中成功返回,或 Thread.isAlive 返回 false。
- 中断法则:一个线程调用另一个线程的 interrupt happens-before 于被中断的线程发现中断。
- 终结法则:一个对象的构造函数的结束 happens-before 于这个对象 finalizer 的开始。
- 传递性:如果 A happens-before 于 B,且 B happens-before 于 C,则 A happens-before于C
通俗点说,假设代码有两条语句,如果这两条语句没有依赖关系并且语句1优先于语句2执行,打乱它们的关系对最终的结果没有影响时,那么真正交给CPU去执行时,执行顺序可以颠倒