我正在尝试理解偏向锁定背后的基本原理,并将其设为默认值。自阅读this blog post以来,即:
由于大多数对象在其生存期内最多被一个线程锁定,因此我们允许该线程将对象偏向自身。
我很困惑..。为什么会有人设计一组同步的方法,只供一个线程访问呢?在大多数情况下,人们专门为多线程用例设计特定的构建块,而不是单线程用例。在这种情况下,没有偏向的线程的每一次锁获取都是以安全点为代价的,这是一个巨大的开销!有没有人能帮我理解一下我在这张照片中遗漏了什么?
发布于 2017-11-28 05:49:37
原因可能是有相当数量的库和类被设计为线程安全的,但在这种情况下仍然有用。这对于许多比Collections框架更早的类来说尤其如此。Vector
及其子类就是一个很好的例子。如果您还考虑到大多数java程序不是多线程的,那么在大多数情况下,使用偏向锁定方案是一种整体改进,尤其是对于使用此类类非常普遍的遗留代码。
发布于 2017-11-30 16:07:50
你在某种程度上是正确的,但在某些情况下,这是必要的,正如Holger在他的评论中非常正确地指出的那样。存在所谓的宽限期,即根本不尝试偏向锁定的宽限期,因此这种情况不会一直发生。当我最后一次查看代码时,它是5 seconds
。为了证明这一点,您需要一个能够检查Java Object标头的库(我想到的是jol
),因为偏向锁定是在mark word
中持有的。因此,只有在5秒后,之前持有锁的对象才会偏向相同的锁。
编辑
我想为此写一个测试,但似乎已经有了!这里是is the link for it
https://stackoverflow.com/questions/47519963
复制相似问题