synchronized重入和升级

lmlx
  • 2
新手上路,请多包涵

假设程序刚开始跑, 只有一个线程在那重入, 一个线程应该是偏向锁的情况,那它是怎么控制重入次数的呢?
如果再来几个线程,就变成重量级锁了, 如果这个线程已经重入了10次还在跑。
重量级锁在在moniter中记录, 那这10次在偏向锁以及轻量级锁的时候会记录在哪里

回复
阅读 1.2k
2 个回答

偏向锁没有次数这一说,会在监视器头里记录线程ID,如果一直是这个ID,就相当于无锁状态。线程重入没太明白你的意思,一般说的是锁重入。猜测你说的是锁重入。偏向锁中单个线程中锁重入,也相当于是没锁。而轻量级锁,如果mark word 和 栈上displace 的交换失败,依然会检查是否当前线程获取了锁,如果获取了,就继续执行,如果不是当前线程获取了,说明出现了线程争抢,开始膨胀为重量级锁。参考《深入理解java虚拟机》锁优化那一章节。

  • synchronized是通过 Monitor 实现,也就是 monitorenter 和 monitorexit
  • 执行monitorenter 指令的时候会去尝试获取对象的锁
  • 如果对象没有被锁定或者当前线程已经持有了对象的锁,则锁的计数器加一

如果一个线程在重入就是不停的在执行monitorenter、monitorexit。当他判断自己已经获取到对象的锁时,就只是计数器加一。偏向锁或者轻量级锁、重量级锁都是只是获取锁的方式,跟计数器不是一个逻辑。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏