温习《Java并发编程的艺术》
volatile
定义
轻量级的synchonized
在多处理器开发保证了共享变了的可见性(一个线程修改了一个共享变了,另外一个线程能够读取这个修改的值)
实现原理
Lock前缀指令会引起处理器缓存回写到内存
一个处理器的缓存回到内存会导致其他处理器的缓存无效
目的
准确和一致地更新共享变量
使用优化
追加字节能优化性能
为什么追加64字节能够提高并发编程的效率呢
在下面两种情况不应该是用64字节
缓存行非64字节宽的处理器
缓存变量不会被频繁地写
synchronized
定义
作用
对于普通同步形式,锁是当前实例对象
对于静态同步方法,锁是当前Class对象
对于同步方法块,锁是synchonized括号里配置的对象
实现原理
jvm基于进入和退出Monitor对象来实现方法同步和代码同步
使用monitorenter和monitorexit指令实现,在编译后插入到插入代码
头对象
synchonized用的锁是存在java对象头里的,数组用3个字宽存储对象头,非数组用2个字宽存储对象头
Markword 默认存储对象的Hashcode、分代年龄、锁标记位
锁升级与优化
从1.6以后为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁和轻量锁
锁级别从低到高
无锁状态
偏向锁状态
轻量锁状态
重量锁状态
原子操作的实现原理
其他
名词解释
内存屏障
缓存行
原子操作
缓存行填充
缓存命中
写命中
写缺失