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