synchronized
锁降级的概念:
sync(Object)
第一个线程进入后,markword 记录这个线程的 ID(偏差锁)
如果有线程争用:降级为自旋锁
自旋 10 次当前,降级为重量级锁(OS)
线程数少 – 自旋锁 线程数多 – 重量级锁
操作耗费工夫短 – 自旋锁 操作耗费工夫长 – 重量级锁
volatile
保障线程可见性
对于主存中一个数据来说,默认状况下启动一个线程,线程 a 从主存中读取到后,会 copy 到线程缓存中,此时如果有另外一个线程更新了主存中的数据,然而 a 线程并不会再去主存中读取,造成线程之间的 不可见 。应用 volatile,能够使线程 a 每次在用到这个数据时。都去主存中从新读取一次,这样就保障了线程之间的 可见性。
volatile 援用类型只能保障援用自身的可见性,不能保障外部字段的可见性,也就是说,如果一个对象的援用被 volatile 润饰,此对象的属性更新是不可见的,只有该援用的对象产生了变动才是可见的。