提示:这里可以添加技术概要
JMM(Java Memory Mode)
JMM描述的是一种抽象的概念,并不真实存在,是一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性,有序性、可见性展开.
这里需要注意主存和工作内存
可见性
volatile(能否及时看见)
原子性
num++,//实际不止一个操作1.读 2.加1
有序性
volatile可以禁止指令重排序
原理:硬件层的内存屏障
CPU缓存一致性协议MESI
cpu早期使用总线保证缓存一致,但这样不能体现出多核cpu的优势
后期采用缓存一致性
缓存有4个状态M:修改 、E:独享、S:共享、I无效
缓存行:缓存存储数据的单元,大小64byte
若产生缓存一致性问题,这个缓存是S共享状态,bus总线来决策加锁,若thread-a加锁,会通知thread-b丢弃原来的数据
happen-before
一组并发编程的规则
Synchronized
synchronized代码块是由一对儿monitorenter/monitorexit指令实现的
对象在内存中分为三块:
1.对象头:用于存储对象自身的运行时数据, 如哈希码
(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,它是实现轻量级锁和偏向锁的关键
2.实例数据
3.对齐填充
锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重 量级锁,但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级。