synchronized:
有三种定义
1:普通同步方法 锁是当前实例对象
2:静态同步方法 锁是当前实例的class对象
3:同步方法块 锁定的是括号内的对象
volitle :
1:处理器会对volitle对象的写操作增加 LOCK#,该操作将一个处理器缓存数据写入到内存,此时会暂时锁定数据总线
2:缓存写入到内存的操作会导致其他处理器的缓存失效 ,下次访问时会从内存读取 强行填充到处理器缓存
锁升级:
无锁(无操作)–>偏向锁(MarkWord)–>轻量级锁(MarkWord 自旋)–>重量级锁(MarkWord 阻塞)
1-偏向锁时(MarkWord)存储获取当前锁对象的线程ID
2-轻量级锁时复制(MarkWord) ,然后CAS替换(MarkWord),如果成功则获得锁 否则自旋(理解为 while-true)
3-自旋锁失效,状态升级为阻塞,所以线程等待CAS替换 (MarkWord) 成功则获得锁 ,其他线程阻塞。
关于synchronized的使用场景及互斥说明, 可参见
https://blog.youkuaiyun.com/u010842515/article/details/65443084
参考书籍:Java并发编程艺术(方腾飞等)