Javaの同期についての質問がSOに出てくるときはいつでも、synchronized(this)
避けなければならないことを非常に熱心に指摘する人もいます。代わりに、プライベートリファレンスのロックが優先されると主張しています。
指定された理由のいくつかは次のとおりです。
- いくつかの邪悪なコードがあなたのロックを盗む可能性があります(これは非常に人気があり、「偶然に」変種もあります)
- 同じクラス内のすべての同期されたメソッドは、まったく同じロックを使用するため、スループットが低下します
- (不必要に)情報を公開しすぎている
私を含む他の人々synchronized(this)
は、それが(Javaライブラリーでも)よく使用されるイディオムであり、安全でよく理解されていると主張します。バグがあり、マルチスレッドプログラムで何が行われているかの手掛かりがないため、これを回避することはできません。つまり、該当する場合はそれを使用します。
私は、ロックオンを回避するthis
ことが望ましい場合に、ロックオンを回避することが望ましい実際の例(foobarのものではない)をいくつか見ることに興味synchronized(this)
があります。
したがって、常に避けsynchronized(this)
て、プライベートリファレンスのロックに置き換える必要がありますか?
いくつかの詳細情報(回答が提供されると更新されます):
- インスタンスの同期について話している
- の暗黙的な(
synchronized
メソッド)と明示的な形式のsynchronized(this)
両方が考慮されます - この件に関してBlochまたは他の当局を引用する場合は、好ましくない部分を省略しないでください(例:効果的なJava、スレッドセーフティの項目:通常はインスタンス自体のロックですが、例外があります)。
synchronized(this)
提供以外の細かいロックが必要な場合synchronized(this)
は適用されないため、問題はありません。