synchronized优化
重量级锁
早期版本的synchronized是依赖对象内部的monitor锁来实现,而monitor依赖于操作系统的互斥锁实现。当系统检查为重量级锁,则会把想要获取锁的线程进行阻塞(被阻塞的线程不消耗CPU)。但阻塞或唤醒线程时,都需要从用户态切换到内核态,导致开销很大。
无锁
对象刚创建时是无锁状态。
偏向锁
线程执行到锁相关代码段时,线程占有该锁。即这个锁会偏向第一个获得它的线程。如果没有其他线程来竞争,持有偏向锁的线程永远不需要进行同步。
轻量级锁
线程在自己的线程栈中,新建一个锁记录LockRecord,并将它的指针指向锁对象。并将锁对象的MrakWord复制到LockRecord中。将锁对象的MarkWord替换为LockRecord的指针。
分为自旋锁和自适应自旋锁
自旋锁:当锁已被线程A占有,线程B也想要获取锁,此时就会不断进行CAS操作,不断尝试获取锁。超过一定次数则更改MarkWord,修改为重量级锁。(优化引入了自适应自旋锁)(自旋会消耗CPU,一旦升为重量级锁,则不会恢复到轻量级锁)
自适应自旋锁:为获得过锁的线程增加自旋时间,反之减少。
版权声明:本文为weixin_44062783原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。