Java 有偏锁定设计决策

Java 有偏锁定设计决策,java,concurrency,locking,biased-locking,Java,Concurrency,Locking,Biased Locking,我试图理解有偏锁定背后的一个基本原理,并将其作为默认设置。自阅读以来,即: “由于大多数对象在其生存期内最多被一个线程锁定,因此我们允许该线程将对象偏向自身” 我很困惑。。。为什么有人要设计一组只由一个线程访问的同步方法?在大多数情况下,人们专门为多线程用例设计某些构建块,而不是单线程用例。在这种情况下,由一个没有偏差的线程获取的每一个锁都是以一个safepoint为代价的,这是一个巨大的开销!有人能帮我理解我在这张图片中遗漏了什么吗?原因可能是有相当数量的库和类是设计为线程安全的,但在这种情况

我试图理解有偏锁定背后的一个基本原理,并将其作为默认设置。自阅读以来,即:

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


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

原因可能是有相当数量的库和类是设计为线程安全的,但在这种情况下它们仍然有用。对于许多早于集合框架的类来说尤其如此<代码>向量及其子类就是一个很好的例子。如果你还认为大多数java程序不是多线程的,那么在大多数情况下,使用偏置锁定方案是一个整体的改进,这在遗留代码中尤其如此,在使用这些类的情况下,所有的代码都是通用的。正如霍尔格在评论中非常正确地指出的那样。有一个所谓的宽限期,在这个宽限期内,根本没有尝试过有偏差的锁定,所以这并不是一直都会发生。我记得上次看代码时,时间是
5秒
。为了证明这一点,您需要一个可以检查Java对象头的库(
jol
),因为在
markword
中有偏差锁定。因此,只有在5秒钟之后,之前持有锁的对象才会偏向同一个锁

编辑


我想写一个测试,但似乎已经有了!这里

多个线程安全对象(特别是在Java的早期)在大多数情况下用于单个线程用例(例如Vector、Hashtable、StringBuffer)。关于第二个问题,论文说:“如果另一个线程试图获取一个有偏差的对象,那么我们需要撤销原始线程的偏差。(此时,我们可以重新调整对象的偏差,或者简单地在对象的剩余生命周期内恢复正常锁定。)。例如,请参阅类加载。当然,这必须以线程安全的方式实现。不过,大多数情况下,几乎所有类都是在应用程序启动期间由主线程加载的,或者至少在另一个线程首次获取类加载锁之前加载了大量类。