当一个线程持有 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/