原理
这篇大佬的讲的还是比较详细了:深入理解Java并发之synchronized实现原理
- 是悲观锁:
- 是非公平锁: Synchronized在线程进入ContentionList时,等待的线程会先 尝试自旋获取锁,如果获取不到就进入
ContentionList,这明显对于已经进入队列的线程是 不公平的,还有一个不公平的事情就是自旋获取锁的线程还可能直接抢占
OnDeck 线程的锁 资源。
然后记住几幅图:
锁升级
偏向锁
- 存thread id
- 001 → 101
- 批量重偏向,阈值:20
- 批量撤销,阈值:40
轻量锁
- 标识:00
- 做CAS,存指向Thread中lock record的指针
- 可重入
重量级锁
- 标识:10
- monitor
自旋锁
CAS原理
这篇文章讲的很清楚:什么是CAS机制?