java的内存模型认识
参考,欢迎点击原文:https://www.bilibili.com/video/BV1CW411U726(B站)
https://www.bilibili.com/video/BV12t411u726(B站)
https://www.bilibili.com/video/BV1F64y1B7sV(B站)
java内存模型这一块看文章看的我实在是累,抽个空去我大B站找找相关视频地铁上看吧,整理了一下
科普tip:new一个对象占16字节
并发编程三大特性:可见性,原子性,有序性
对象:对象头,对象体数据,尾部填充对其字节
Cpu组成: 寄存器(计算的),计数器(存储指令地址)
线程调度: 操作系统
先来贴个java内存多线程工作原理图
如图,线程ABC各自有自己的工作内存,这个工作内存也可以称之为共享变量副本,
- 工作内存是什么用的呢?其实就是线程自己都会有自己的内存,这个内存是从主内存那边copy过来的。
- 同样主内存是啥?可以理解为咱们的jvm使用的运行内存,每次线程操作完资源后都会同步资源到主内存中
- jmm :java内存模型,使用了“缓存一致性协议”
大概解释了下图中的各个名词,下面来说下运行原理:
如线程A在使用资源小a时,线程B也获得了资源小a,同时资源B也正在对小a进行操作,这样同时两个线程对一个资源操作的话就会出现问题,如都给小a加一,这样的话,如果线程A和线程B都返回值给主内存了,小a对值就对不上了,所以这样我们就衍生了针对性处理的方案。
- 加悲观锁:每次操作小a时候都先上把锁,其他线程如果想获取小a需要先等锁释放了才能拿到这资源。
- 使用volatile修饰资源:这个关键词的使用是建立在缓存一致性协议上的,就是资源小a一旦发生改变就立即同步到主内存中,这个操作且保证了原子性和一致性,这样其他线程拿到的就是最新的