使每个对象都可锁定看起来像是一个设计错误:
- 您为创建的每个对象增加了额外的成本,即使您实际上只会在一小部分对象中使用它。
- 锁的使用变得隐式,拥有
lockMap.get(key).lock()
比任意对象上的同步更具可读性,例如synchronize (key) {...}
. - 同步方法可能会导致用户使用同步方法锁定对象的细微错误
- 您可以确定,在将对象传递给 3rd parting API 时,它的锁没有被使用。
例如
class Syncer {
synchronized void foo(){}
}
...
Syncer s = new Syncer();
synchronize(s) {
...
}
// in another thread
s.foo() // oops, waiting for previous section, deadlocks potential
- 更不用说每个对象的命名空间污染(在 C# 中至少方法是静态的,在 Java 中同步原语必须使用,而不是在...
await
中重载)wait
Object
但是我确信这种设计是有原因的。内在锁的最大好处是什么?