什么是Java多线程的happen before原则?

目录

      • 1、程序次序规则(Program Order Rule):
      • 2、锁定规则(Lock Rule):
      • 3、volatile 变量规则:
      • 4、线程启动规则(Thread Start Rule):
      • 5、线程终止规则(Thread Termination Rule):
      • 6、中断规则(Interruption Rule):
      • 7、对象终结规则(Finalizer Rule):
      • 8、传递性(Transitivity):

Java 多线程的 “Happens-Before” 原则是 Java 内存模型(Java Memory Model,JMM)中的一组规则,用于定义在多线程环境下,操作执行的顺序性和可见性,这些规则确保了对共享变量的操作在不同线程间的正确同步。具体包括以下几个方面:

1、程序次序规则(Program Order Rule):

在一个线程中,所有的操作都是按照程序代码的顺序执行的。这意味着在一个线程中的每个动作都 Happens-Before 于该线程中的后续动作。

2、锁定规则(Lock Rule):

释放一个锁 Happens-Before 后续对同一个锁的加锁。这意味着如果一个线程释放锁,那么随后获取这个锁的线程将能够看到之前释放锁的线程所做的所有修改。

3、volatile 变量规则:

对一个 volatile 变量的写操作 Happens-Before 后续对这个变量的读操作。这确保了对 volatile 变量的修改对其他线程是可见的。

4、线程启动规则(Thread Start Rule):

线程 A 启动线程 B 后,线程 B 的所有操作 Happens-Before 线程 A 启动线程 B 的操作。

5、线程终止规则(Thread Termination Rule):

线程 A 的所有操作 Happens-Before 线程 A 终止的操作。这保证了在主线程中调用 Thread.join() 方法等待其他线程终止后,主线程能够看到其他线程的所有操作。

6、中断规则(Interruption Rule):

对线程调用 interrupt() 方法 Happens-Before 被中断线程检测到中断的发生。

7、对象终结规则(Finalizer Rule):

一个对象的初始化操作 Happens-Before 该对象的 finalize() 方法的开始。这确保了对象在被垃圾回收时的正确清理。

8、传递性(Transitivity):

如果操作 A Happens-Before 操作 B,且操作 B Happens-Before 操作 C,则操作 A Happens-Before 操作 C。

这些规则形成了 Java 内存模型的基础,提供了一种可靠的内存访问规则,以便程序员能够更容易地推断在并发环境下的操作顺序。理解并遵循 “Happens-Before” 原则对于正确编写并发代码至关重要。

你可能感兴趣的:(#,Java多线程,java)