synchronized锁升级
synchronized锁升级的过程如下:
- 无锁状态:在对象头中的Mark Word的分布为,此时并没有线程来获取资源。
- 偏向锁状态:当线程A抢到了锁,锁偏向位改为1,锁标记为不变,指针指向线程A。线程A再次获取锁时,发现锁状态为偏向锁,并且指针指向自己,就可以继续获取锁。
- 轻量级锁状态:当线程B来获取锁时,发现是偏向锁,但指针并不指向自己。线程B就会以CAS算法来获取锁,如果抢锁成功,则可以执行。如果获取失败,则会升级为轻量级锁。此时会在线程B的栈开辟一片空间指向Mark Word的指针,他们互相指向。如果指向成功,线程B就抢到了锁。如果指向失败,将开启自旋锁,线程会不断自旋抢锁。如果自旋次数达到一定值(默认10次),将锁升级为为重量级锁。
- 重量级锁状态:升级为重量级锁之后,未抢到锁的线程都被阻塞排队,等待被操作系统唤醒。
以上就是synchronized锁升级的过程。
本文作者:xiaoovo
本文链接:https://www.cnblogs.com/xiaoovo/p/17800820.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步