Java内存模型

目录

一、前言:

二、java内存模型(JMM):

三、volatile关键字

volatile的使用:

四、synchronized关键字

五、volatile与synchronized的比较:


一、前言:

  • 在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。
  • java的并发采用的是共享内存模型:通过读/写内存中的公共状态进行隐式通信。

二、java内存模型(JMM):

概念:

  • java线程之间的通信是由java内存模型控制的,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

说明:

  • 线程之间的共享变量存储在主内存中,每个线程都有一个私有的工作内存,工作内存中存储了该线程读/写共享变量的副本。
  • 工作内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
  • 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。
  • 不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

三、volatile关键字

相关概念:

  • 缓存行:缓存器中可以分配的最小存储单位。
  • L1缓存:内部缓存。
  • L2缓存:外部缓存。
  • 为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存中的数据读到缓存(L1、L2)后再进行操作,但操作完成后,处理器并不知道何时要把操作后的数据写回到内存中。

重排序:

概念:在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。

  • 编译器重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
  • 处理器重排序:
    • 指令级并行的重排序:现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
    • 内存系统的重排序:  由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

volatile的使用:

用volatile修饰的变量如果被一个线程更改了,那么其它的线程都会立即感知,并且每个线程获取该变量的值都是最新的值,访问volatile修饰的变量看起来就像是直接在内存中读写一样。

原理:

  • 对volatile修饰的变量进行写操作时,JVM会向处理器发送一条Lock前缀的指令(在编译成字节码时就已经插入该指令了),将这个变量所在缓存行(即JMM中的工作内存)的数据写回到系统内存中,并且将其它CPU里缓存了该内存地址的数据无效。这样其它线程就会及时获取到这个变量的最新值,同时也达到了禁止处理器对指令的重排序的效果。

volatile的内存原语:

  • 当读一个volatile变量时,JMM会把该线程对应的工作内存置为无效,线程接下来将从主内存中读取共享变量。
  • 当写一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主内存,即:
    • 将本地内存中的数据设置为无效,  
    • 从主内存中将数据复制到本地内存中,  
    • 在本地内存中进行操作,  
    • 操作完成后将本地内存中的数据刷新到主内存中。整体看起来就像是直接在主内存中操作一样。  

特性:

  • 可见性:对一个volatile变量的读,(任意线程)总是能看到对这个volatile变量最后的写入。
  • 原子性:对一个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

优点:

  • 不会引起线程上下文的切换

四、synchronized关键字

五、volatile与synchronized的比较:

  • volatile只能修饰变量,synchronized可以修饰代码块、方法
  • volatile不能保证原子性,synchronized保证原子性:
    • volatile可以保证数据的可见性,但是不能保证原子性,所以volatile解决的是变量在多线程之间的可见性;
    • synchronized可以保证原子性,也保证了可见性(synchronized会将私有内存和公共内存中的数据做同步),所以synchronized解决的是多线程之间访问资源的同步性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值