【Java并发编程七】Java内存模型

JMM内存模型

 JVM定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。JMM调用栈和本地变量存放在线程栈上,对象存放在堆上。

操作可见性

 线程间通信必须要经过主内存。如果线程A与线程B之间要通信的话,必须要经历下面2个步骤:

 1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。

 2)线程B到主内存中去读取线程A之前已更新过的共享变量。

 线程对共享变量修改的可见性。当一个线程修改了共享变量的值,其他线程能够立刻得知这个修改。可以通过以下方式实现:

  • Java中的volatile关键字:volatile关键字可以保证直接从主存中读取一个变量,如果这个变量被修改后,总是会被写回到主存中去。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是volatile变量都是如此,普通变量与volatile变量的区别是:volatile的特殊规则保证了新值能立即同步到主内存,以及每个线程在每次使用volatile变量前都立即从主内存刷新。因此我们可以说volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。
  • Java中的synchronized关键字:同步快的可见性是由"如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值"、"对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)"这两条规则获得的。
  • Java中的final关键字:final关键字的可见性是指,被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把"this"的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到"初始化了一半"的对象),那么在其他线程就能看见final字段的值(无须同步)

synchronized与volatile的区别

 synchronized可以实现操作的一致性。

相关推荐
小羊没烦恼!17 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里17 小时前
java中的继承和多态的区别
java
小羊没烦恼!17 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕17 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码17 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖17 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时18 小时前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读18 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang18 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车19 小时前
C/C++ 为什么需要编译器?
开发语言·c++