首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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。

43610
您找到你想要的搜索结果了吗?
是的
没有找到

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原则的。

46530

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关键词。

37510

Happens-beofre 先行发生原则(JVM 规范)

先行发生原则 指的是JMM中定义的两项操作之间的依序关系 happens- before关系 主要用于强调两个有冲突的动作之间的顺序,以及定义数据争用的发生时机 如果说操作A先行发生于操作B,就是在说发生...对象锁(监视器锁)法则(Monitor Lock Rule ) 某个 管程(也叫做对象锁,监视器锁) 上的unlock动作happens-before同一个管程上后续的lock动作 。...上面八条是原生Java满足Happens-before关系的规则,但是我们可以对他们进行推导出 其他满足happens-before的案例 将一个元素放入一个线程安全的队列的操作Happens-Before...从队列中取出这个元素的操作 将一个元素放入一个线程安全容器的操作Happens-Before从容器中取出这个元素的操作 在CountDownLatch上的倒数操作Happens-Before CountDownLatch...Future表示的任务的所有操作Happens-Before Future#get()操作 向Executor提交一个Runnable或Callable的操作Happens-Before任务开始执行操作

44310
领券