学习别人总结记录,比较浅,可能会有问题,欢迎指正。
1. 用法
- 修饰普通方法(对象锁)
- 修饰静态方法(类锁)
- 修饰代码块(synchronized(obj) 对象锁 synchronzied(Demo.class) 类锁)
2. 实现原理
monitor机制,monitor存在于每个对象头,会被变异成monitorenter 和 monitorexit指令,可重入,执行monitor一次就加1,执行monitorexit一次就减1,当成为0就释放锁。
3. 锁类型
synchronized重量级锁,锁竞争会阻塞线程,造成用户态和内核态的切换,会影响性能。所以jdk1.6后引入偏向锁和轻量级锁。
synchronized锁状态4种:无锁、偏向锁、轻量级锁、重量级锁
偏向锁
当一个线程第一次获得锁时,会在对象头中Mark Word中几下threadId,当线程再次执行时,会判断对象头中threadId是否一致,一致则是同一对象锁,则直接执行代码。若不一致,则会CAS替换,成功则获得偏向锁,失败说明正有线程占有锁,将升级为偏向锁。
偏向锁不会主动释放,撤销时会stop the world。
偏向锁默认开启,可以通过配置jvm参数useBiasedLocking控制是否开启。
轻量级锁(自旋锁)
当一个线程获得偏向锁,再有线程来竞争锁,将会自旋等待,自旋一定的次数后,会升级为重量级锁。
自旋锁是因为可能锁竞争并不激烈,很快就可以获得锁。
重量级锁
当前获得锁线程执行,其他线程挂起,当锁释放后,重新竞争锁。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END