有偏见的锁定设计决定

时间:2017-11-27 21:19:09

标签: java concurrency locking biased-locking

我正在尝试了解偏向锁定背后的基本原理并将其设为默认值。自阅读this blog post以来,即:

"由于大多数对象在其生命周期中至多被一个线程锁定,我们允许该线程将对象偏向自身"

我很困惑...为什么有人会设计一组同步的方法只能被一个线程访问?在大多数情况下,人们专门为多线程用例设计某些构建块,而不是单线程用例。在这种情况下,每一个没有偏见的线程的锁定采购都是以安全点为代价的,这是一个巨大的开销!有人可以帮我理解这张照片中缺少的东西吗?

2 个答案:

答案 0 :(得分:1)

原因可能是有相当数量的库和类被设计为线程安全但在这种情况之外仍然有用。对于早于Collections框架的许多类来说尤其如此。 Vector它的子类就是一个很好的例子。如果你还认为大多数java程序都不是多线程的,那么在大多数情况下使用偏置锁定方案是一个整体改进,对于遗留代码来说尤其如此,因为这些类的使用都是常见的。

答案 1 :(得分:0)

你在某种程度上是正确的,但有些情况下需要,因为Holger非常正确地指出了他的评论。当没有尝试任何偏置锁定时,就会出现所谓的宽限期,因此不会发生这种情况。正如我上次记得查看代码一样,它是5 seconds。为了证明这一点,你需要一个可以检查Java Object头部的库(jol出现在我的脑海中),因为有偏见的锁定在mark word内。因此,只有在5秒之后,之前持有锁的对象才会偏向朝向同一个锁。

修改

我想为此写一个测试,但似乎已经有一个!这里is the link for it