我正在阅读B. Goetz's Java concurrency in pratice,现在我正处于关于锁定的部分。他说那个
每个对象都有一个内置锁的事实只是一个方便 这样你就不需要显式创建锁对象了.9
9回想起来, 这个设计决策 可能是一个糟糕的问题:它不仅令人困惑,而且迫使JVM实现者制造 对象大小和锁定性能之间的权衡。
因为,我是并发新手,他所谈论的设计决策并不明显。从性能的角度来看,创建显式锁对象是不是很糟糕,不是吗?
答案 0 :(得分:3)
我自己从未实现过JVM,甚至没有参与过它的开发,但我可以想象这个权衡。
将内在锁与每个对象关联起来的第一个想法是这样做:将锁与其状态(我被锁定,由哪个线程)关联到JVM中创建的每个对象,与对象状态的其余部分共存。这应该是有效的,但是,它也会使每个创建的对象占用内存中的额外空间,并且大多数情况下,该空间永远不会被使用(因为同步不常见,并且大多数对象从不用作锁)
另一个想法是维护某种单独的惰性字典,只有当该对象实际用作锁时才会为对象创建锁及其状态。这很明显,并且可能效率较低,因为字典需要与对象保持并行等,但它会在内存中占用更少的空间。
我认为,这是Brian Goetz谈到的权衡(或权衡的一部分)。它确实不那么令人困惑,如果只有特定的对象可以充当锁,那么实现可能会更简单。