【数媒在线课堂】临界区
也就是加锁,运行两个函数的时候都加上相同的锁,这样就保证了两个线程执行两个函数的有序性,在同步方法里只要负责 as-if-serial 即可。
Happens-Before
因为有指令重排的存在会导致难以理解 CPU 内部运行规则,JDK 用 happens-before 的概念来阐述操作之间的内存可见性。在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 happens-before 关系 。其中 CPU 的 happens-before 无需任何同步手段就可以保证的。
如果一个操作 happens-before 另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。(对程序员来说)
两个操作之间存在 happens-before 关系,并不意味着 Java 平台的具体实现必须要按照 happens-before 关系指定的顺序来执行。如果重排序之后的执行结果,与按 happens-before 关系来执行的结果一致,那么这种重排序是允许的 (对编译器和处理器 来说)
happens-before 具体规则 Mark 下,以备不时之需。
程序顺序规则:一个线程中的每个操作,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 () 操作成功返回。7. 线程中断规则:对线程 interrupt 方法的调用 happens-before 于被中断线程的代码检测到中断事件的发生。