下面是java内存模型下一些“天然”的先行发生关系,这些先行发生关系无须任何同步器协助就已经存在,可以在编码中直接使用。如果两个操作之间的关系不再此列,并且无法从下面规则中推导出来,则它们就没有顺序性保障,虚拟机可以对它们进行任意地重排序。
1.Program order rule. Each action in a thread happens-before every action in that thread that comes later in the program order.
程序次序规则:在一个线程内,按照程序代码的顺序,书写在前面的操作先行发生与书写在后面的操作。
2.Monitor lock rule. An unlock on a monitor lock happens-before every subsequent lock on that same monitor lock.
冠程锁定规则:一个锁的unlock操作先行发生于“后面”对同一个锁的lock操作。这里的“后面”是指时间上的先后顺序。
3.Volatile variable rule. A write to a volatile field happens-before every subsequent read of that same field.
volatile变量规则:对一个volatile变量的写操作先行发生于“后面”对这个变量的读操作。这里的“后面”同样是指时间上的先后顺序。
4.Thread start rule. A call to Thread.start on a thread happens-before any other thread detects taht thread has terminated, either by successfully return from Thread.join or by Thread.isAlive returning false.
线程的启动规则:Thread对象的start()方法先行发生于此线程的没一个动作。
5.Interruption rule. A thread calling interrupt on another thread happens-before the interrupted thread detects the interrupt( either by having InterruptedException thrown, or invoking isInterrupted or interrupted).
线程中断规则:对线程的interrupt()方法的调用先行发生于被中断线程的代码检测。
6.Finalizer rule. The end of a constrcutor for an object happens-before the start of the finalizer for that obejct.
对象终结原则:一个对象的初始化完成(构造函数执行完成)先行发生与它的finalize()方法的开始。
7.Transitivity. If A happens-before B, and B happens-before C, then A happens-before C.
传递性:你懂的。
相关推荐
### Happens-Before原则详解 #### 一、引言 Happens-before原则是Java并发编程中的一个重要概念,用于描述程序中的操作之间的顺序关系。它不仅有助于理解和解决并发编程中的可见性问题,还为程序员提供了关于多...
"深入浅出了解happens-before原则" 在 Java 内存模型(JMM)中,happens-before 原则是一个核心概念,它规定了多线程环境下的可见性原则。该原则的核心思想是:两个操作之间的 happens-before 关系,并不意味着前一...
happens-before原则的定义是:如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。这个原则可以帮助我们判断数据是否存在竞争,线程...
为了解决这个问题,Java引入了"happens-before"原则,它是一种确保正确同步和数据可见性的规则。 1. **程序顺序规则**: 这个规则指出,在同一线程内,程序中表现出的顺序应该被维护,即每个操作`happens-before`...
在Java并发编程中,理解和掌握volatile关键字以及happens-before原则对于解决内存一致性错误至关重要。内存一致性错误通常出现在多线程环境下,当不同线程访问共享变量时,由于缓存和处理器优化,可能导致数据不一致...
在Java 5及以后的版本中,引入了happens-before原则,来保证并发程序的正确性。 happens-before原则是Java内存模型中的一个重要概念,它定义了两个操作之间的内存可见性。如果操作X happens-before 操作Y,那么X对Y...
随着并发编程需求的增长,Java从JDK5开始引入了新的内存模型,它基于happens-before原则,这是一个由Leslie Lamport提出的用于描述事件顺序的概念。新内存模型用happens-before规则来规定操作之间的执行顺序,以确保...
Java内存模型(JMM,Java Memory Model)是Java并发编程中的关键概念,它定义了Java程序中各个线程对共享变量的访问规则,确保...通过遵循Happens-Before原则,我们可以有效地避免并发问题,实现高效且可靠的并发程序。
happens-before原则是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到。“影响”包括修改了内存中共享变量的值、 发送了消息...
从标签来看,文档会涉及如JSR(Java Specification Request)、内存模型、线程规范以及happens-before原则和synchronized关键字。这些词汇暗示了文档将对Java内存模型进行深入讲解,并探讨多线程环境下的线程通信和...
这种关系是由Java内存模型(Java Memory Model,JMM)中的happens before原则定义的。 首先,我们需要理解happens before的概念。在JMM中,如果一个操作happens before另一个操作,那么第一个操作的结果对第二个...
Happens-before原则(先行发生原则) a.程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;(保证单线程,但不保证多线程); b.锁定规则:一个unlock操作先行发生于后面对同一个锁...
JMM定义了happens-before原则,这是一个用于描述线程间操作顺序的重要概念。如果一个操作happens-before另一个操作,那么第一个操作的结果对第二个操作必须是可见的,并且第一个操作的执行顺序在程序逻辑上被认为是...
但是,JMM规定了在某些特定情况下,重排序必须遵守happens-before原则。 6. **final域的语义**: - 对于final字段,一旦初始化完成,就无法改变。这保证了在多线程环境下,final字段对所有线程的可见性。 7. **...
happens-before原则是JMM中的关键概念,它定义了一种部分顺序关系。如果一个动作A发生在另一个动作B之前(即A happens-before B),那么B必须能看到A的结果。例如,释放锁的动作(unlock)总是发生在后续获取同一锁...
再者,JMM还规定了happens-before原则,这是一个用于判断两个操作之间是否有顺序关系的规则。如果一个操作happens-before另一个操作,那么第一个操作的改变对第二个操作来说总是可见的,并且第二个操作不能被重排序...
happens-before原则指的是按照写代码的主观意愿,可能期望是要么指令1先执行,要么指令3先执行,指令1先执行就不应该看到指令4写入的值,如果是指令3先执行,就不应该看到指令2写入的值。 Java内存模型(JMM)中...
Java通过插入适当的内存屏障来实现happens-before原则。 - **线程局部变量**(ThreadLocal):每个线程都有自己的副本,避免了线程间的数据共享问题,但也可能导致内存泄漏。 - **final域的初始化安全性**:对于一...
9. Happens-Before原则:这是JMM定义的一种内存可见性规则,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在Happens-Before关系。这是理解和分析Java并发程序正确性的基础。 以上内容仅是...