Synchronized

1.对象头

Synchronized
Synchronized

2.Monitor

Synchronized
Synchronized
Synchronized
Synchronized
同一个对象与同一个Monitor相关联;
对象obj被加锁以后,它的MarkWord里存储Monitor指针;线程2得到锁以后,Monitor的Owner指向线程2,其他线程访问Monitor的时候先检查Owner位置是不是指向自己,如果是则再次获得锁,如果不是,进入阻塞队列EntryList等待,直到线程2执行完代码释放Owner。

3.轻量级锁

轻量级锁不使用monitor,只用了锁记录;
Synchronized
Synchronized
Synchronized
Synchronized
Synchronized
Synchronized
同一个线程重入对象的时候,CAS操作失败,会在栈帧里添加新的锁记录;
Synchronized

4.锁膨胀

Synchronized
Synchronized

5.自旋优化

Synchronized
避免上下文切换,适合多核CPU下。
Synchronized
Synchronized
Synchronized

6.偏向锁

Synchronized
Synchronized
轻量级锁每次重入都会进行CAS操作
Synchronized
Synchronized
对象头在偏向锁开启后,其中的线程ID是操所系统赋值的;

7.偏向锁撤销

1.当对象调用hashcode方法以后会自动关闭偏向锁,因为对象头不能同时存储hashcode跟线程Id;

注意:轻量级锁调用hashcode方法,hashcode会存在栈帧的锁记录里;
重量级锁调用hashcode方法,hashcode会存在Monitor里;所以轻量级锁和重量级锁在调用hashcode方法时不会被关闭,解锁以后会还原。
2.其他线程使用偏向锁
Synchronized
3.调用wait/notify
因为wait/notify只有重量级锁能调用。

8.批量重偏向

Synchronized

9.批量撤销

Synchronized

10.锁消除

JIT:即使编译器
当JIT检测到,某个对象不会被共享,如果该对象加了synchronized其实是没有意义的,所以JIT会将其优化掉,消除锁。