`
lan13217
  • 浏览: 495851 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

happens-before

    博客分类:
  • Java
 
阅读更多

内存一致性属性

Java Language Specification 第 17 章定义了内存操作(如共享变量的读写)的 happen-before 关系。只有写入操作 happen-before 读取操作时,才保证一个线程写入的结果对另一个线程的读取是可视的。 synchronized 和 volatile 构造 happen-before 关系,Thread.start() 和 Thread.join() 方法形成 happen-before 关系。尤其是:

  • 线程中的每个操作 happen-before 稍后按程序顺序传入的该线程中的每个操作。
  • 一个解除锁监视器的(synchronized 阻塞或方法退出)happen-before 相同监视器的每个后续锁(synchronized 阻塞或方法进入)。并且因为 happen-before 关系是可传递的,所以解除锁定之前的线程的所有操作 happen-before 锁定该监视器的任何线程后续的所有操作。
  • 写入 volatile 字段 happen-before 每个后续读取相同字段。volatile 字段的读取和写入与进入和退出监视器具有相似的内存一致性效果,但 需要互斥锁。
  • 在线程上调用 start happen-before 已启动的线程中的任何线程。
  • 线程中的所有操作 happen-before 从该线程上的 join 成功返回的任何其他线程。

java.util.concurrent 中所有类的方法及其子包扩展了这些对更高级别同步的保证。尤其是:

  • 线程中将一个对象放入任何并发 collection 之前的操作 happen-before 从另一线程中的 collection 访问或移除该元素的后续操作。
  • 线程中向 Executor 提交 Runnable 之前的操作 happen-before 其执行开始。同样适用于向 ExecutorService 提交 Callables
  • 异步计算(由 Future 表示)所采取的操作 happen-before 通过另一线程中 Future.get() 获取结果后续的操作。
  • “释放”同步储存方法(如 Lock.unlockSemaphore.release 和 CountDownLatch.countDown)之前的操作 happen-before 另一线程中相同同步储存对象成功“获取”方法(如 Lock.lockSemaphore.acquireCondition.await 和 CountDownLatch.await)的后续操作。
  • 对于通过 Exchanger 成功交换对象的每个线程对,每个线程中 exchange() 之前的操作 happen-before 另一线程中对应 exchange() 后续的操作。
  • 调用 CyclicBarrier.await 之前的操作 happen-before 屏障操作所执行的操作,屏障操作所执行的操作 happen-before 从另一线程中对应 await 成功返回的后续操作。
分享到:
评论

相关推荐

    happens-before俗解

    ### Happens-Before原则详解 #### 一、引言 Happens-before原则是Java并发编程中的一个重要概念,用于描述程序中的操作之间的顺序关系。它不仅有助于理解和解决并发编程中的可见性问题,还为程序员提供了关于多...

    浅谈Java内存模型之happens-before

    "浅谈Java内存模型之happens-before" Java内存模型是Java虚拟机中的一种机制,用于定义Java程序中线程之间的内存访问方式。在多线程环境下,线程之间的通信和数据共享是非常复杂的,需要有一些规则来保证数据的一致...

    深入浅出了解happens-before原则

    "深入浅出了解happens-before原则" 在 Java 内存模型(JMM)中,happens-before 原则是一个核心概念,它规定了多线程环境下的可见性原则。该原则的核心思想是:两个操作之间的 happens-before 关系,并不意味着前一...

    Java内存之happens-before和重排序

    Java内存模型中的happens-before和重排序 Java内存模型(JMM)是Java虚拟机(JVM)中的一种抽象模型,用于描述Java程序中的内存交互。其中,happens-before关系是JMM中的一种基本概念,用于描述操作之间的顺序关系...

    简单易懂讲解happens-before原则

    为了解决这个问题,Java引入了"happens-before"原则,它是一种确保正确同步和数据可见性的规则。 1. **程序顺序规则**: 这个规则指出,在同一线程内,程序中表现出的顺序应该被维护,即每个操作`happens-before`...

    Java内存模型(JMM)及happens-before原理

    Java内存模型(JMM)及happens-before原理 Java内存模型(JMM)是Java虚拟机(JVM)中的一组规则,用于定义 Java 程序中的内存访问顺序。它规定了在多线程环境中,变量的写入操作对其他线程的可见性。JMM的主要目的是...

    volatile与happens-before的关系与内存一致性错误

    在Java并发编程中,理解和掌握volatile关键字以及happens-before原则对于解决内存一致性错误至关重要。内存一致性错误通常出现在多线程环境下,当不同线程访问共享变量时,由于缓存和处理器优化,可能导致数据不一致...

    锁的释放-获取建立的happens before 关系

    "锁的释放-获取建立的happens before关系"是指在并发执行的线程之间,当一个线程释放锁之后,另一个线程获取同一把锁时,它们之间存在一种特定的内存可见性保证。这种关系是由Java内存模型(Java Memory Model,JMM...

    13Java内存模型1

    在Java 5及以后的版本中,引入了happens-before原则,来保证并发程序的正确性。 happens-before原则是Java内存模型中的一个重要概念,它定义了两个操作之间的内存可见性。如果操作X happens-before 操作Y,那么X对Y...

    ConcurrentHashMap底层实现机制的分析1

    * 传递性:如果 A happens-before 于 B,且 B happens-before C,则 A happens-before C。 二、ConcurrentHashMap 的结构分析 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来...

    2023年Java面试题+详细总结.docx

    4. 传递性:如果 A happens-before B,且 B happens-before C,那么 A happens-before C。 5. 线程启动规则:Thread 对象的 start()方法 happens-before 于此线程的每一个动作。 Volatile 和 Synchronized ...

    Java内存模型的历史变迁.docx

    4. 传递性:如果A happens-before B,B happens-before C,则A happens-before C。 5. start()规则:启动线程B的操作发生在B线程内任何操作之前。 6. join()规则:线程A成功等待线程B结束,B线程内的所有操作发生在A...

    java锁的释放与建立

    本篇文章将深入探讨Java锁的释放与建立,以及它们之间的_happens-before_关系,旨在帮助开发者更好地理解和应用并发控制。 首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`...

    13 问题的根源—Java内存模型简介.pdf

    3. **Happens-Before规则**:Happens-Before是JMM的核心概念,它定义了两个操作之间的顺序关系,确保一个操作的结果能被另一个操作观察到。主要规则包括程序顺序、锁的释放与获取、volatile变量的写读、线程启动、...

    JSR133中文版.pdf

    从标签来看,文档会涉及如JSR(Java Specification Request)、内存模型、线程规范以及happens-before原则和synchronized关键字。这些词汇暗示了文档将对Java内存模型进行深入讲解,并探讨多线程环境下的线程通信和...

    彩虹岛启动器qtga.dll

    happens-before原则是Java内存模型中定义的两项操作之间的偏序关系,如果说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到。“影响”包括修改了内存中共享变量的值、 发送了消息...

    Java多线程-知识点梳理和总结-超详细-面试知识点.docx

    本文从Java多线程的基本概念开始,逐步深入到Java多线程的高级话题,涵盖了Java多线程的所有方面,包括volatile关键字、Java内存模型、Happens-Before关系、synchronized关键字、ConcurrentHashMap、...

    Java 多线程与并发(1-26)-Java 并发 - 理论基础.pdf

    Java 中的并发机制主要通过 Java 内存模型(JMM)和 Happens-Before 规则来实现。JMM 定义了 Java 程序中的内存模型,规定了变量的存储和读取规则。Happens-Before 规则则规定了操作的执行顺序和可见性规则。 线程...

Global site tag (gtag.js) - Google Analytics