Java内存模型
Java内存模型
明天争取
听一首好歌,写一段代码,阅生活百态。
展开
-
深入理解Java内存模型(一)
一、并发编程模型的分类。 线程之间如何进行通信及线程之间如何同步? 线程:指并发执行的活动实体,即线程对象。 通信:指线程之间以何种机制来交换信息,即沟通方式。 (1)线程之间的通信机制有两种: 共享内存。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过读-写内存中的公共状态来进行通信。(隐式) 消息传递。 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发...原创 2019-06-06 09:34:04 · 275 阅读 · 0 评论 -
深入理解Java内存模型(二)
一、数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。 JMM对正确同步的多线程程序的内存一致性做了如下...原创 2019-06-10 16:20:54 · 148 阅读 · 0 评论 -
深入理解Java内存模型(三)
一、volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: class VolatileFeaturesExample { //使用volatile声明64位的long型变量 ...原创 2019-06-11 19:12:42 · 211 阅读 · 0 评论 -
深入理解Java内存模型(四)
一、锁的释放-获取建立的happens before关系 锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码: class MonitorExample { int a = 0; public synchronized void writer() { //1 a++; ...原创 2019-06-12 09:05:44 · 1124 阅读 · 0 评论 -
深入理解Java内存模型(五)
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。 对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 下面,我们通过一些示例性的代码来分别说...原创 2019-06-13 13:46:33 · 141 阅读 · 0 评论