Java のクリティカルセクションでは、何を基準に同期を取ればいいのでしょうか?
2023-11-23 22:34:18
質問
Javaでは、コード中のクリティカルセクションを宣言する慣用的な方法は以下の通りです。
private void doSomething() {
// thread-safe code
synchronized(this) {
// thread-unsafe code
}
// thread-safe code
}
ほとんど全てのブロックは
this
に同期していますが、これには特別な理由があるのでしょうか?他の可能性はありますか?どのオブジェクトに同期させるかについて、ベストプラクティスはありますか?(例えば、プライベートインスタンスの
Object
?)
どのように解決するのですか?
まず、以下のコードスニペットが同一であることに注意してください。
public void foo() {
synchronized (this) {
// do something thread-safe
}
}
とする。
public synchronized void foo() {
// do something thread-safe
}
する 全く同じ . コードの読みやすさとスタイルを除けば、どちらを好むということはありません。
メソッドやコードのブロックを同期させる場合、以下のことを知ることが重要です。 なぜ を知ることが重要です。 どのような対象 をロックしているのか、そして 何のために .
また、次のような状況もあることに注意してください。
クライアントサイドの同期
ブロックのコードで、要求しているモニタ (すなわち、同期オブジェクト) が必ずしも
this
である必要はなく、この例のように :
Vector v = getSomeGlobalVector();
synchronized (v) {
// some thread-safe operation on the vector
}
舞台裏で何が起こっているのかを正確に知ることができれば、大きな助けとなるでしょう。以下をチェックしてみてください。 Javaにおける並行プログラミング という本があります。このテーマを手っ取り早く学びたいのであれば Java の並行処理 @ Sun
関連
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
java send https request prompt java.security.cert.について。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
最新
-
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は、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Javaでsynchronized(this)を避けるには?
-
[解決済み】同期とロック
-
[解決済み】Synchronized Blockの代わりにSynchronized Methodを使用する利点はありますか?