Javaで変数を同期させたりロックする方法は?
2023-08-03 14:52:57
質問
この小さな簡単なサンプルを使ってみましょう。
class Sample {
private String msg = null;
public void newmsg(String x){
msg = x;
}
public String getmsg(){
String temp = msg;
msg = null;
return temp;
}
}
という関数があるとします。
newmsg()
は、私がアクセスできない他のスレッドから呼び出されるとします。
synchonizeメソッドを使って、文字列が
msg
が一回につき一つの関数によってのみ使用されることを保証するために、synchonize メソッドを使用したいと思います。言い換えれば、関数
newmsg()
とは同時には実行できません。
getmsg()
.
どのように解決するのですか?
とても簡単です。
class Sample {
private String message = null;
private final Object lock = new Object();
public void newMessage(String x) {
synchronized (lock) {
message = x;
}
}
public String getMessage() {
synchronized (lock) {
String temp = message;
message = null;
return temp;
}
}
}
なお、私は
はしませんでした。
メソッド自体を同期させるか、あるいは
this
. 私は、自分のコードだけがアクセスできるオブジェクトに対してのみロックを取得するのが良いアイデアだと確信しています。
意図的に
ロックを公開する場合を除きます。これは、自分のコードと異なる順序でロックを取得するものが他にないことを、自分自身を安心させるために非常に簡単にします。
関連
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
最新
-
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 の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Javaでよくある構文エラー
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
無効な文字定数
-
セミコロン期待値エラー解決
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
API の戻り値を処理するために ResponseEntity を使用する
-
Java基礎 - マッピングとQ/A
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ