美文网首页
并发编程中的内存模型

并发编程中的内存模型

作者: 天冷请穿衣 | 来源:发表于2019-12-31 16:11 被阅读0次

2019-12-30

并发编程基础:
并发编程模型中要解决的两个关键问题:线程之间如何通信及线程之间如何同步。
两种并发编程模型:共享内存模型和消息传递模型。前者的消息通信是隐式进行的,但同步需要显式进行;后者的同步是隐式进行的,但消息通信是显式进行的。
Java并发采用的是共享内存模型。所以Java程序编程需要解决同步问题。
在Java中,所有的实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。局部变量、方法定义的参数和异常处理器的参数存储在线程的本地内存中,不存在内存可见性问题。
Java内存模式(JMM)控制Java线程之间的通信,JMM决定一个线程对共享变量的写入何时对其它线程可见。
程序执行时存在的重排序:
1)编译器优化的重排序
2)指令级并行的重排序
3)内存系统的重排序

内存可见性:
JMM中要使一个操作的结果对于另一个操作可见,这两个操作之间必须存在happens-before关系。
happens-before相关规则:
1.程序顺序规则,一个线程中的某一个操作,happens-before于后续的任意操作。
2.监控器锁规则,对于一个监控器锁的释放操作,happens-before于随后对该锁的获取。
3.volatile规则,对于一个volatile域的写操作,happens-before于任意后续的该域的读操作。
4.传递性规则,操作A happens-before操作B,而且操作B happens-before于操作C,那么操作A happens-before操作C。
5.线程start()方法规则,在 线程A中调用线程B的start(),那么对线程B的start()的调用操作happens-before线程B中的所有操作。
6.线程join()方法规则。在线程A中执行线程B的join(),那么线程B中的任意操作happens-before于线程A执行线程B的join()方法的返回。

数据依赖性:如果两个操作对同一个变量进行操作,只要有一个操作是写操作,那么这两个操作之间就存在数据依赖关系。编译器和处理器不会改变存在数据依赖关系的两个操作之间的执行顺序。
as-if-serial语义的定义:不管怎么样重排序,(单线程)程序的执行结果不能被改变。

内存模型的分类:顺序一致性内存模型、Java内存模型、处理器内存模型。
顺序一致性内存模型是一个理想的参考模型,Java内存模型是语言级的内存模型,处理器内存模型是系统级的内存模型,后两者通常以顺序一致性内存模型作为参照。

顺序一致性内存模型的两大特性:
1)一个线程中的所有操作必须按照程序的顺序来执行;
2)所有线程都只能看到一个单一的操作顺序,且每一个操作都是原子执行且结果立即对所有线程可见。

在JMM中,正确同步的程序的执行结果与该程序在顺序一致性的内存模型的执行的结果一致。
JMM为了保证happens-before的规则,JMM会禁止编译器和处理器改变程序执行结果的重排序。

相关文章

网友评论

      本文标题:并发编程中的内存模型

      本文链接:https://www.haomeiwen.com/subject/irmmoctx.html