数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争。Java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确 ...
分类:
编程语言 时间:
2017-08-09 21:20:47
阅读次数:
232
并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写 ...
分类:
编程语言 时间:
2017-08-09 21:16:28
阅读次数:
242
JMM 掌管着一个线程对内存的动作 (读和写)影响其他线程对内存的动作的方式。由于使用处理器寄存器和预处理 cache 来提高内存访问速度带来的性能提升,Java 语言规范(JLS)允许一些内存操作并不对于所有其他线程立即可见。有两种语言机制可用于保证跨线程内存操作的一致性――synchronize ...
分类:
编程语言 时间:
2017-08-09 21:15:41
阅读次数:
227
[转载自并发编程网 – ifeve.com 原文链接:http://ifeve.com/tag/jmm/] 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将 ...
分类:
编程语言 时间:
2017-08-09 21:10:14
阅读次数:
249
锁的释放-获取建立的happens before 关系 锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 下面是锁释放-获取的示例代码: [java] view plaincopy class MonitorExample { in ...
分类:
编程语言 时间:
2017-08-09 21:09:24
阅读次数:
177
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则: 下面,我们通过一些示例性的代码来分别说明这两个规则: [java] view plain copy public class FinalExample { in ...
分类:
编程语言 时间:
2017-08-09 21:06:35
阅读次数:
193
final域的内存语义写final域的重排规则:禁止把final域的写重排序到构造方法之外,主要包括俩个个方面1)JMM禁止编译器把final域的写重排序到构造方法之外2)编译器会在final域写之后,构造函数return之前插入一个storestore屏障,这个屏障禁止处理器把final域的写重排序到构造..
分类:
编程语言 时间:
2017-08-07 17:36:45
阅读次数:
146