与内在锁同步

St.*_*rio 5 java multithreading

我正在阅读B. Goetz 的 Java concurrency in Pratice,现在我正在阅读有关锁定的部分。他说过

每个对象都有一个内置锁这一事实只是为了方便,因此您无需显式创建锁对象。 9

9 回想起来,这个设计决定可能是一个糟糕的决定:它不仅会令人困惑,而且会迫使 JVM 实现者在对象大小和锁定性能之间做出权衡。

因为,我是并发的新手,所以他在谈论什么设计决策并不明显。从性能的角度来看,创建显式锁定对象很糟糕,不是吗?

JB *_*zet 3

我自己从未实现过 JVM,甚至没有参与过它的开发,但我可以想象其中的权衡。

将内在锁与每个对象关联起来时想到的第一个想法就是这样做:将一个锁及其状态(我是否被哪个线程锁定)关联到 JVM 中创建的每个对象,并与该对象位于同一位置。对象状态的其余部分。这应该是高效的,但是,它也使每个创建的对象在内存中占用额外的空间,并且该空间在大多数情况下永远不会被使用(因为同步并不常见,并且大多数对象从不用作锁) 。

另一个想法是维护某种单独的惰性字典,仅当该对象实际用作锁时才会为该对象创建锁及其状态。这是不太明显的,并且可能效率较低,因为字典需要与对象等并行维护。但它会使用更少的内存空间。

因此,我认为,这就是布莱恩·戈茨(Brian Goetz)谈到的权衡(或权衡的一部分)。如果只有特定的对象可以充当锁,那么确实不会那么混乱,并且实现可能会更简单。