すべてのオブジェクトをロック可能にすることは、設計ミスのように見えます。
- オブジェクトのごく一部でしか使用しない場合でも、作成されるすべてのオブジェクトに追加のコストがかかります。
- ロックの使用は暗黙的になり、
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
)
しかし、このデザインには何らかの理由があると確信しています。固有ロックの大きな利点は何ですか?