vk网站做婚介网站建站
Java 内存区域
引言:
在并发编程中,需要解决两个问题:线程之间如何通信和线程之间如何同步
通信是指线程之间以何种机制来交换信息
在命令式编程中,通信机制主要分为两种:共享内存和消息传递
Java 的并发采用的是共享内存模型
1、哪些内容受 JMM 影响?哪些不受?
在 Java 中,所有的实例域、静态域和数组元素都存储在堆内存中,堆内存在线程之间共享。
而方法定义参数、局部变量和异常处理参数不会再线程之间共享,也就不受 JMM 影响。
受 JMM 影响的区域:
- 堆内存,也就是 实例域、静态域、数组元素
2、JMM 的作用
JMM 决定一个线程对共享变量的写入何时对另一个线程可见。
JMM 抽象了线程和主内存间的关系:
主内存中存储的有用来读/写的共享变量,线程中存储的有共享变量的副本,也就是本地内存。
如果线程 A 要给线程 B 进行通信的话,要经过两个必要步骤:
- 线程 A 把更新后的值,重新刷会主内存。
- 线程 B 从主内存中,重新拿取最新值
JMM 通过控制主内存与每个线程的本地内存间的交互,来为 Java 程序员提供内存可见性的保证。
3、JMM 是如何做到可见性的保证
JMM 的编译器重排序规则会禁止特定类型的编译器重排序(不是所有的编译器重排序都要禁止)。对于处理器重排序,JMM 的处理器重排序规则会要求 Java 编译器在生成指令序列时,插入特定类型的内存屏障(Memory Barriers,Intel称之为 Memory Fence)指令,通过内存屏障指令来禁止特定类型的处理器重排序。