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