- synchronized 之前一直都是重量级锁,但是 JDK6 中官方是对他进行过升级,引入了偏向锁,轻量级锁,重量级锁,现在采用的是锁升级的方式去做的。针对synchronized 获取锁的方式,JVM 使用了锁升级的优化方式,就是先使用偏向锁优先同一线程然后再次获取锁,如果失败,就升级为 CAS 轻量级锁,如果失败就会短暂自旋,防止线程被系统挂起。最后如果以上都失败就升级为重量级锁。所以是一步步升级上去的,最初也是通过很多轻量级的方式锁定的
- ReentantLock 是 JDK 层面的,synchronized 是 JVM 层面的。相对而言,synchronized 的性能优化空间更大,这就使得 synchronized 能够随着 JDK 版本的升级而不改动代码的前提下获得性能上的提升。
- 另外此处 synchronized 锁住的是单个链表的头结点,粒度小,而不是 Hashtable、Collections 等锁整个哈希表。低粒度下,synchronized 和 Lock 的差异没有高粒度下明显。
对象头 Mark Word(标记字段)