[解決済み] Javaでsynchronized(this)を避けるには?
質問
SOでJavaの同期に関する質問が出ると、やたらと指摘する人がいる。
synchronized(this)
は避けるべきでしょう。代わりに、プライベートな参照へのロックが望ましいと主張します。
与えられた理由のいくつかを紹介します。
- 一部 悪コード ロックを盗むかもしれない (これは非常に人気があります。quot;accidentally" のバリエーションもあります)
- 同じクラス内のすべての同期化されたメソッドは、まったく同じロックを使用するため、スループットが低下します。
- 不必要に)多くの情報を公開している。
私を含め、他の人たちは次のように主張しています。
synchronized(this)
は、(Javaのライブラリでも)よく使われているイディオムで、安全であり、よく理解されています。バグがあるから、マルチスレッドプログラムで何が起こっているのかわからないから、という理由で避けるべきではありません。言い換えれば、適用できるのであれば、それを使いなさいということです。
へのロックを回避する実例を(foobarのようなものでなく)見てみたいと思っています。
this
の方が望ましい。
synchronized(this)
でもよい。
ですから。
は常に避けるべきでしょう。
synchronized(this)
を使用し、プライベート参照へのロックに置き換えるか?
詳細情報(回答があり次第更新します。)
- インスタンスの同期化について話しています
-
暗黙的な(
synchronized
メソッド) と明示的なsynchronized(this)
とされています。 - ブロッホや他の権威者を引用する場合、気に入らない部分を省かないこと(例:Effective Java、Thread Safetyの項目。 一般的にはインスタンス自体のロックですが、例外もあります)。
-
以外のロックの粒度が必要な場合は、以下のようになります。
synchronized(this)
が提供するのはsynchronized(this)
は適用されないので、それは問題ではない
解決方法は?
各ポイントを個別に説明します。
-
邪悪なコードがあなたのロックを盗むかもしれません(これは非常に人気があります。 偶然の産物)
それよりも心配なのは うっかり . 何が言いたいかというと、この使い方は
this
は、あなたのクラスの公開されたインターフェイスの一部であり、文書化されるべきものです。 時には、他のコードがあなたのロックを使用できるようにすることが望まれます。 これは次のような場合に当てはまります。Collections.synchronizedMap
(javadocを参照)。 -
<ブロッククオート
同じクラス内のすべての同期化されたメソッドは、まったく同じ ロックされるため、スループットが低下する
これはあまりにも単純な考え方で、単に
synchronized(this)
は解決しません。 スループットのために適切な同期をとるには、もっと熟考が必要です。 -
あなたは(不必要に)多くの情報を暴露している
1の変形版です。 使用方法
synchronized(this)
は、あなたのインターフェースの一部です。 もし、これを公開したくない、または公開する必要がないのであれば、やらないことです。
関連
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
-
[解決済み】静的なMapを初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
eclipse で「アクセス制限: タイプ 'HttpServer' は API ではありません」というプロンプトが表示される。
-
をインスタンス化することができません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
IDEA パッケージステートメントの欠落
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
-
[解決済み】同期とロック
-
[解決済み】Synchronized Blockの代わりにSynchronized Methodを使用する利点はありますか?