Java线程内存模型

1.JMM内存模型

  • 跟cpu缓存模型类似,是基于cpu缓存模型来建立的,Java线程
    内存模型是标准化的,屏蔽到了底层不同计算机的区别
    在这里插入图片描述

2.JMM数据原子操作

  • read(读取):从主内存读取数据
  • load(载入):将主内存读取到的数据写入工作内存
  • use(使用):从工作内存读取数据来计算
  • assign(赋值):将计算好的值重新赋值到工作内存中
  • store(储存):将工作内存数据写入主内存
  • write(写入):将store过去的变量值赋值给主内存中的变量
  • lock(锁定):将主内存变量加锁,标识为线程独占状态
  • unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量
    在这里插入图片描述

3.JMM缓存不一致问题

1.总线加锁(性能太低)

将并行的线程改为串行(通过加锁),这样其他cpu没法去读或写这个数据,直到这个cpu使用完数据释放锁之后其它cpu才能读取该数据

2.MESI缓存的一致性
  • 其中某个cpu修改了缓存里的数据,该数据会马上同步回主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效

  • 通过总线实现,cpu总线嗅探(监听机制),然后使工作内存值失效,重新读取

4.Volatile可见性底层实现原理

1.Volatile可见性底层实现原理
  • 采用了MESI缓存一致性实现,源码解析
  • 开发手册对lock指令前缀的解释:
    1.会将当前处理器缓存行的数据立即协会到系统内存
    ​ 2.这个协会内存的操作会引起其他cpu里缓存了该内存地址的数据无效(MESI协议)
    在这里插入图片描述

5.总结

1.volatile底层采用C语言编写,所以通过查看汇编代码分析底层是西安主要通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并回写到主内存

2.整体过程,线程2修改内存缓存值,volatile进行加锁(在store之前加锁,write写成功后才会unlock),然后同步回主内存,经过总线激发MESI缓存一致性协议,让其他线程工作内存的值工作副本失效,重新读取,做到了线程数据同步

3.volatile加锁相比总线加锁性能高很多,总线加锁从read到write整个过程伴随着锁

4.解决的是多线程访问共享变量的可见性问题的,结合Java内存模型图,和汇编语言的lock前置指令结合

5.Volatile可见性丶原子性和有序性

  • 1.并发编程三大特性:可见性,原子性,有序性
  • 2.volatile保证可见性和有序性,但不保证原子性,保证原子性需要借助synchronized这样的锁机制
发布了12 篇原创文章 · 获赞 2 · 访问量 423

猜你喜欢

转载自blog.csdn.net/weixin_43308406/article/details/102846002