我正在尝试了解偏向锁定背后的基本原理并将其设为默认值。由于阅读了这篇博文,即:
“由于大多数对象在其生命周期内最多被一个线程锁定,因此我们允许该线程将对象偏向自身”
我很困惑......为什么有人会设计一组同步的方法,只能由一个线程访问?在大多数情况下,人们专门为多线程用例设计某些构建块,而不是单线程用例。在这种情况下,没有偏差的线程的每次锁获取都是以安全点为代价的,这是一个巨大的开销!有人可以帮我理解这张照片中我缺少什么吗?
我正在尝试了解偏向锁定背后的基本原理并将其设为默认值。由于阅读了这篇博文,即:
“由于大多数对象在其生命周期内最多被一个线程锁定,因此我们允许该线程将对象偏向自身”
我很困惑......为什么有人会设计一组同步的方法,只能由一个线程访问?在大多数情况下,人们专门为多线程用例设计某些构建块,而不是单线程用例。在这种情况下,没有偏差的线程的每次锁获取都是以安全点为代价的,这是一个巨大的开销!有人可以帮我理解这张照片中我缺少什么吗?
The reason is probably that there are a decent number of libraries and classes that are designed to be thread safe but that are still useful outside of such circumstances. This is especially true of a number of classes that predate the Collections framework. Vector
and it's subclasses is a good example. If you also consider that most java programs are not multi threaded it is in most cases an overall improvement to use a biased locking scheme, this is especially true of legacy code where the use of such Classes is all to common.
您在某种程度上是正确的,但在某些情况下需要这样做,正如霍尔格在他的评论中非常正确地指出的那样。有所谓的,完全不尝试偏向锁定的宽限期,所以这种情况不会一直发生。当我最后一次记得查看代码时,它是5 seconds
. 为了证明这一点,您需要一个可以检查 Java 对象的标头的库(jol
我想到了),因为偏向锁定在内部mark word
。所以只有在 5 秒后,之前持有锁的对象才会偏向同一个锁。
编辑
我想为此写一个测试,但似乎已经有一个!这是它的链接