happens-before是JMM最核心的概念,理解happens-before是理解JMM的关键。 一.JMM的设计 首先,让我们先分析一下JMM的设计意图。从JMM的设计者的角度,在设计JMM的时候要考虑一下两个关键因素: 1.程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序 ...
分类:
移动开发 时间:
2018-07-31 23:39:07
阅读次数:
203
如下代码: 会打印出error吗?(这里有个Bug,先不考虑,就是整数会溢出的情况) 答案是不会,因为value1是volatile的,根据可见性,那么2 happens before 3,所以递推,4 happens before 1。所以v2不可能小于v1。 如果去掉volatile,就有可能发 ...
分类:
其他好文 时间:
2018-05-08 14:44:46
阅读次数:
173
转载自 http://www.cnblogs.com/chenssy/p/6393321.html 无论处理器、JVM、编译器都会都保证程序正确的前提下尽可能的对指令执行效率进行优化,进行指令重排等操作。而要保证程序的执行结果的正确,则必须要遵循JMM中规定的happens-before原则。 在J ...
分类:
移动开发 时间:
2018-05-02 10:01:56
阅读次数:
214
无论处理器、JVM、编译器都会都保证程序正确的前提下尽可能的对指令执行效率进行优化,进行指令重排等操作。而要保证程序的执行结果的正确,则必须要遵循JMM中规定的happens-before原则。 在Java内存模型(JMM)中,如果一个操作的执行结果需要对另一个操作可见,那么两个操作必须要存在hap ...
分类:
移动开发 时间:
2018-05-01 12:18:18
阅读次数:
1075
Java语言中有一个“先行发生”(happens-before)的原则。这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依据,依赖这个原则,我们可以通过几条规则一揽子解决并发环境下两个操作之间是否可能存在冲突的所有问题。现在就来看看“先行发生”原则指的是什么。先行发生是Java内存模型 ...
分类:
编程语言 时间:
2018-04-20 10:57:32
阅读次数:
273
http://ifeve.com/easy-happens-before/ https://en.wikipedia.org/wiki/Happened-before https://blog.csdn.net/ns_code/article/details/17348313 https://www ...
分类:
移动开发 时间:
2018-04-15 11:50:43
阅读次数:
168
前篇博客【死磕Java并发】—–深入分析volatile的实现原理 中已经阐述了volatile的特性了: 下面LZ就通过happens-before原则和volatile的内存语义两个方向介绍volatile。 volatile与happens-before 在这篇博客【死磕Java并发】—–Ja ...
分类:
编程语言 时间:
2018-04-12 13:41:43
阅读次数:
168
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 如果看过LZ上篇博客的就会知道,其实这两点可以归结于一点:无法通过happens-before原则推导出来的,JMM允许任意的排序。 as-if-serial语 ...
分类:
编程语言 时间:
2018-04-12 13:35:52
阅读次数:
194
http://ifeve.com/concurrenthashmap-weakly-consistent/ 为什么ConcurrentHashMap是弱一致的 本文将用到Java内存模型的happens-before偏序关系(下文将简称为hb)以及ConcurrentHashMap的底层模型相关的知 ...
分类:
其他好文 时间:
2018-02-23 13:25:02
阅读次数:
205
1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域 ...
分类:
移动开发 时间:
2018-02-02 18:38:41
阅读次数:
281