2

我正在尝试了解偏向锁定背后的基本原理并将其设为默认值。由于阅读了这篇博文,即:

“由于大多数对象在其生命周期内最多被一个线程锁定,因此我们允许该线程将对象偏向自身”

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

4

2 回答 2

1

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.

于 2017-11-27T21:49:37.293 回答
0

您在某种程度上是正确的,但在某些情况下要这样做,正如霍尔格在他的评论中非常正确地指出的那样。有所谓的,完全不尝试偏向锁定的宽限期,所以这种情况不会一直发生。当我最后一次记得查看代码时,它是5 seconds. 为了证明这一点,您需要一个可以检查 Java 对象的标头的库(jol我想到了),因为偏向锁定在内部mark word。所以只有在 5 秒后,之前持有锁的对象才会偏向同一个锁。

编辑

我想为此写一个测试,但似乎已经有一个!这是它的链接

于 2017-11-30T08:07:50.157 回答