在着名的Java Concurrency in Practice,第2.4节中,它表明内部锁定方法与显式锁相比是一个糟糕的设计决策,因为它令人困惑,而且“......它迫使JVM实现者在对象大小和锁定性能。“ 有人可以解释对象大小如何影响锁定性能?
答案 0 :(得分:5)
因为每个对象都可以被锁定,这意味着每个对象都必须有足够的空间来存储锁定时所需的所有信息。
这是相当没有吸引力的,因为绝大多数物体永远不会被锁定,所以我们浪费了大量的空间。所以在实践中,Hotspot通过使用2bits来记录对象的状态并根据这两个位重用对象头的其余部分来解决这个问题。
然后是整个有偏见/无偏见的锁定东西..你可以开始阅读它here。 Hotspot文档并不是我所说的广泛,但锁定和对象标题比其他大多数更好。但有疑问:阅读源代码。
PS:我们对每个对象的本地哈希码也有类似的问题。 “只要使用内存地址”,如果你的GC改变对象周围就不是很好。 (但与锁定相反,没有真正的替代方案 - 如果我们想要这个功能)
答案 1 :(得分:2)
最有效的锁使用原生单词大小,例如32位字段。但是,您不希望向每个对象添加4个字节,因此使用AFAIK 1位,但设置此位比设置字长更昂贵。