Java并发-Java内存模型

线程之间的通信与同步

通信是指线程之间以何种机制来交换信息,线程之间的通信机制有两种:共享内存和消息传递。
在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。

同步是指程序中用于控制不同线程间操作发生相对顺序的机制。
在共享内存并发模型里,同步时显式进行的。程序员必须指定某个方法或者某段代码需要在线程之间互斥执行。
在消息传递的并发模型里,由于消息的发送必须在消息接受之前,因此同步是隐式进行的。

Java采用共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

Java内存模型的抽象结构

所有实例,静态域和数组元素都存储在对堆内存中,堆内存在线程之间共享。
局部变量,方法定义参数和异常处理器参数不会在线程之间共享,不受内存模型的影响。
Java内存模型(JMM)决定一个线程对共享变量的写入何时队另一个线程可见。

《Java并发-Java内存模型》

如果线程A和线程B要通信的话,必须要经历下面2个步骤
1)线程A把本地内存A更新过的共享变量刷新到猪内存中去。
2)线程B到猪内存中去读取线程A之前已更新过的共享变量。

指令序列的重排序

《Java并发-Java内存模型》
上述1属于编译器重排序,2和3属于处理器重排序
对于编译器,JMM的编译器重排序规则会禁止特定类型的编译器重排序。
对于处理器,JMM的处理器重排序规则会要求Java编译器在生成指令序列时,插入特定类型的内存屏障指令,通过内存屏障指令来禁止特定类型的处理器重排序。
JMM属于语言几的内存模型,他确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/qq_29842929/article/details/80783571
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞