首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏吉林乌拉

    happens-before原则

    在Java中有一个很重要的原则,这个原则是判断线程是否存在数据竞争、线程是否安全的主要依据,这个原则就是happens-before原则。我们首先看一下到底什么是happens-before原则。 简单来说happens-before原则就是JMM中定义的两项操作之间的偏向关系。假如我们有两个操作A和B。 上述就是happens-before原则的定义,下面我们用一个简单的例子来说明一下happens-before原则到底有什么作用。 ? 下面我们假设thread-1和thread-2还具有happens-before关系,也就是说thread-1在thread-2之前执行并且我们假设thread-2和thread-3并没有happens-before 如果代码中的操作没有happens-before原则的话,那么虚拟机在执行的时候,就有可能对它们进行随意的重排序。下面我们看一下在JMM中都有哪些操作是默认具有happens-before原则的。

    61330发布于 2019-08-14
  • 来自专栏陈树义

    什么是 happens-before

    到这里,我们需要明白:happens-before 原则是对 Java 内存模型的简化,让我们更好地写出并发代码。 什么是 happens-beforehappens-before 指的是 Java 内存模型中两项操作的顺序关系。 // 在线程 A 中执行 i = 1; // 在线程 B 中执行 j = i; Java 内存模型下一共有 8 条 happens-before 规则,如果线程间的操作无法从如下几个规则推导出来,那么它们的操作就没有顺序性保障 总结 happens-before 原则一共有 8 条原则,它是对 Java 内存模型规则的简化,帮助编程人员提高编程效率。

    65910编辑于 2022-06-28
  • 来自专栏TopCoder

    happens-before那些事儿

    happens-before是一些规则,规定了某个线程修改的变量何时对其他线程可见。从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。 happens-before原则定义如下: 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。 如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。 happens-before规则: 程序次序规则:一段代码在单线程中执行的结果是有序的。 传递规则:体现了happens-before原则具有传递性,即A happens-before B , B happens-before C,那么A happens-before C。

    62910发布于 2020-11-05
  • 来自专栏Spark学习技巧

    JMM之Happens-Before规则

    下面我们就说一下什么是Happens-Before规则。 什么是Happens-Before? 在JMM中,在一个线程中,或不同的线程中。 如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在Happens-Before关系。值得一提的是,我们说两个操作存在Happens-Before关系。这里指的操作的结果。 Happens-Before与我们密切相关的规则: 1.程序顺序规则 一个线程中的每个操作,Happens-Before于该线程中的任意后续操作; 例子: public class HappensBefore 4.传递性 A Happens-Before B ,B Happens-Before C,那么 A Happens-Before C 如下图: ? 2⃣️ , 2⃣️ Happens-Before 3⃣️ , 1⃣️ Happens-Before 3⃣️ 。

    74430发布于 2019-06-14
  • 来自专栏JavaQ

    高并发编程-happens-before

    happens-before是Java内存模型中定义的两个操作之间的偏序关系,即如果操作A在操作B之前先发生,那么操作A产生的操作结果,操作B可以观察到,或者说操作A的结果影响到操作B。 happens-before无需任何同步器的协助,只要两个操作之间的关系符合以下列出的这些规则,或者可以由以下这些规则推导出,那么就可以保证它们的顺序性,否则Java虚拟机可以进行任意重排序。

    56120发布于 2018-12-13
  • 来自专栏小工匠聊架构

    高并发编程-happens-before

    ---- happens-before规则 7个原则 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作 监视器锁规则:对一个锁的解锁,happens-before ·1 happens-before 2和3 happens-before 4由程序顺序规则产生。 下图是该程序对应的happens-before关系图。 ? 1 happens-before 2由程序顺序规则产生。2 happens-before 4由start()规则产生。 该程序对应的happens-before关系图如下: ? 2 happens-before 4由join()规则产生;4 happens-before 5由程序顺序规则产生。 ·A happens-before B。 ·B happens-before C。 ·A happens-before C。 在3个happens-before关系中,2和3是必需的,但1是不必要的。

    40230发布于 2021-08-17
  • 来自专栏多线程

    什么是happens-before原则?

    线程内的happens-before 在同一个线程中,字节码的先后顺序(program order)也暗含了 happens-before 关系:在程序控制流路径中靠前的字节码 happens-before 线程间的 happens-before 解锁操作 happens-before 之后(这里指时钟顺序先后)对同一把锁的加锁操作。 线程的启动操作(即 Thread.starts()) happens-before 该线程的第一个操作。 构造器中的最后一个操作 happens-before 析构器的第一个操作。 happens-before关系的传递性 如果操作 X happens-before 操作 Y,而操作 Y happens-before 操作 Z,那么操作 X happens-before 操作 Z。

    34730编辑于 2023-10-16
  • 来自专栏用户4352451的专栏

    理解java中的happens-Before

    happens-Before 简介 java使用JMM模型后那就使用happens-before来阐述两个线程间的可见性 在JMM中,如果一 个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 happens-before关系。 监视器锁规则:对于一个锁的解锁,happens-before于对这个锁的加锁。 那我们使用这个happens-before变量规则来解释。就说他遵循happens-before规则。那这还是能说的过去的。那就又有人纠结了,那happens-before那又是咋回事呢? happens-before到底是什么? 上面废话了那么多,我觉得我自己晕了。

    84221发布于 2020-09-24
  • 来自专栏冰河技术

    何为Happens-Before原则?这次彻底懂了!

    在正式介绍Happens-Before原则之前,我们先来看一段代码。 其实,答案就是在JDK1.5版本中的Java内存模型中引入了Happens-Before原则。 接下来,我们就结合案例程序来说明Java内存模型中的Happens-Before原则。 【原则三】传递规则 如果A Happens-Before B,并且B Happens-Before C,则A Happens-Before C。 再根据【原则三】传递规则,我们可以得出结论:x = 42 Happens-Before 读变量v=true。 【原则四】锁定规则 对一个锁的解锁操作 Happens-Before于后续对这个锁的加锁操作。

    6.8K82发布于 2020-10-29
  • 来自专栏Java成长之路

    先行发生原则(happens-before)介绍

    内存模型中所有的有序性都仅仅靠volatile和synchronized来完成,那么有一些操作将会变得很烦琐,但是我们在编写Java并发代码的时候并没有感觉到这一点,这是因为Java语言中有一个“先行发生”(happens-before

    3.2K20发布于 2018-09-29
  • 来自专栏程序那些事

    java内存模型(JMM)和happens-before

    Happens-Before 为了保证java内存模型中的操作顺序,JMM为程序中的所有操作定义了一个顺序关系,这个顺序叫做Happens-Before。 要想保证操作B看到操作A的结果,不管A和B是在同一线程还是不同线程,那么A和B必须满足Happens-Before的关系。 如果两个操作不满足happens-before的关系,那么JVM可以对他们任意重排序。 我们看一下happens-before的规则: 1. 讨论之前我们再总结一下happens-before到底是做什么的。 因为JVM会对接收到的指令进行重排序,为了保证指令的执行顺序,我们才有了happens-before规则。 因为bookDLC的赋值操作和返回操作并没有happens-before,所以可能会出现获取到一个仅部分构造的实例。 这也是为什么我们要加上volatile关键词。

    52710发布于 2020-07-08
  • 来自专栏Krains

    happens-before Krains 2020-08-26

    happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛 开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,

    41410发布于 2020-09-10
  • 来自专栏盛开在夏天的太阳

    2.2 指令重排&happens-before 原则 & 内存屏障

    1.2. happens-before 原则 只靠sychronized和volatile关键字来保证原子性、可见性以及有序性,那么编写并发 程序可能会显得十分麻烦,幸运的是,从JDK 5开始,Java 使用新的JSR-133内存模型,提 供了happens-before 原则来辅助保证程序执行的原子性、可见性以及有序性的问题,它是 判断数据是否存在竞争、线程是否安全的依据,happens-before

    2.4K20发布于 2020-09-27
  • 来自专栏HUC思梦的java专栏

    JAVA内存模型和Happens-Before规则

    今天我们继续来探索并发编程的内容,聊一聊JAVA的内存模型和Happens-Before规则。 Happens-Before 规则 接下来我们就来看看今天的主角,Happens-Before是什么? Happens-Before要表达的是:前面一个操作的结果对后续操作是可见的,它约束了编译器的优化行为,虽允许编译器优化导致的指令重排,但是要求编译器优化后一定遵守 Happens-Before 规则。 传递性 这条规则是指如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。 就比如我们上文中的代码,x=42 Happens-Before v=true,写变量v=true Happens-Before 读变量v,那么根据传递性规则,x=42 Happens-Before 读变量

    77610发布于 2020-11-24
  • 来自专栏开发 & 算法杂谈

    基于Happens-before的数据竞争方法汇总 (三)

    在上一篇文章中提到了基于happens-before关系的FastTrack动态数据竞争检测方法,这篇文章中介绍的Loft方法是在FastTrack方法上进行了进一步地改进。

    76630发布于 2018-06-12
  • 来自专栏开发 & 算法杂谈

    基于Happens-before的数据竞争方法汇总 (二)

    Happens-before方法中最基础的方法Djit+,Djit+使用向量时钟VC进行数据竞争分析。

    85230发布于 2018-06-12
  • 来自专栏飞天小牛肉

    JMM 最最最核心的概念:Happens-before 原则

    关于 Happens-before,《Java 并发编程的艺术》书中是这样介绍的: Happens-before 是 JMM 最核心的概念。 关系: 1)A Happens-before B 2)B Happens-before C 3)A Happens-before C 可以看出来,在 3 个 Happens-before 关系中,第 关系: A Happens-before B B Happens-before C A Happens-before C 2)管程锁定规则(Monitor Lock Rule):一个 unlock 操作先行发生于后面对同一个锁的 根据根据程序次序规则:1 Happens-before 2;3 Happens-before 4。 根据 volatile 变量规则:2 Happens-before 3。 根据传递性规则:1 Happens-before 3;1 Happens-before 4。

    1K40发布于 2021-05-14
  • 来自专栏顶级程序员

    死磕 Java 并发 :Java 内存模型之 happens-before

    这就是happens-before原则的威力。 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。 传递规则:提现了happens-before原则具有传递性,即A happens-before B , B happens-before C,那么A happens-before C 线程启动规则:假定线程 上面八条是原生Java满足Happens-before关系的规则,但是我们可以对他们进行推导出其他满足happens-before的规则: 将一个元素放入一个线程安全的队列的操作Happens-Before 提交一个Runnable或Callable的操作Happens-Before任务开始执行操作 这里再说一遍happens-before的概念:如果两个操作不存在上述(前面8条 + 后面6条)任一一个happens-before

    91550发布于 2018-05-03
  • 来自专栏日拱一兵

    可见性有序性,Happens-before来搞定

    这就是那个善意的谎言,虽是谎言,但还是照顾到了程序猿的利益,所以我们只需要了解 happens-before 规则就能得到保证 (图画了好久,不知道是否说明了谎言的所在? ,欢迎留言) Happens-before Happens-before 规则主要用来约束两个操作,两个操作之间具有 happens-before 关系, 并不意味着前一个操作必须要在后一个操作之前执行 的光环,保持理解 Happens-before 的连续性,先不做过多说明 到这里,看这个规则,貌似也没解决啥问题,因为它还要联合第三个规则才起作用 传递性规则 如果 A happens-before B, 且 B happens-before C, 那么 A happens-before C 直接上图说明一下上面的例子 ? 从上图可以看出 x =42 和 y = 50 Happens-before flag = true, 这是规则 1 写变量(代码 3) flag=true Happens-before 读变量(代码 4

    63830发布于 2019-09-17
  • 来自专栏Java架构师必看

    as-if-serial规则和happens-before规则的区别

    2)两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。 利用程序顺序规则(规则1)存在三个happens-before关系:1. A happens-before B;2. B happens-before C;3. A happens-before C。 as-if-serial与happens-before的区别 下面来比较一下as-if-serial和happens-before: as-if-serial VS happens-before happens-before关系给编写正确同步的多线程程序的程序员创造了一个幻境:正确同步的多线程程序是按happens-before指定的顺序来执行的。

    1.1K20发布于 2021-07-14
领券