jvm - 为什么偏向锁使用与轻量级锁不同的标记词

标签 jvm locking

当一个线程持有 bassed-locking 时。标记词是thread id。 但是对于轻量级锁,标记字是指向线程的堆栈指针,为什么不仍然存储线程ID呢?

最佳答案

精简锁架构假定锁定对象的标记字指向锁定该对象的帧的栈槽。此堆栈槽存储原始对象 header (也称为置换 header )。

    Unlocked:
    [ orig_header | 001 ]       | Stack frame |
                                |             |
    Locked:                     |             |
    [ stack_ptr   | 000 ]       |             |
         |                      |-------------|
          --------------------->| orig_header |
                                |-------------|
                                |             |
                                |             |
                                 -------------

显然栈槽携带的信息比线程 ID 多,因为您可以从栈槽导出线程 ID,但反之则不行。

与解锁操作实际上是空操作的偏向模式不同,当对象解锁时,精简锁需要恢复原始 header 。这变得非常简单,因为标记字已经指向具有原始值的堆栈槽。

关于jvm - 为什么偏向锁使用与轻量级锁不同的标记词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031691/

相关文章:

java - 在 Java 虚拟机中处理信号

java - 同步块(synchronized block)中的静态与非静态锁定对象

jquery - 如何在 jQuery 中设置一个复选框来锁定现有的滑动窗口,使其无法移动,然后通过取消选中该框来解锁它?

java - Java 中的 Linux 文件锁定

java - SonarLint 和 IBM JVM 的 HTTPS 问题

java - 什么基于 JVM 的脚本语言支持@WebService 在运行时创建服务?

c# - 线程同步。为什么这个锁不足以同步线程

java - 同步类(class)级别以上的调用

Java 优化范式

eclipse - 项目 "MyProject"具有比运行 Eclipse 更高的编译器选项