1. ホーム
  2. java

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 . 私は、自分のコードだけがアクセスできるオブジェクトに対してのみロックを取得するのが良いアイデアだと確信しています。 意図的に ロックを公開する場合を除きます。これは、自分のコードと異なる順序でロックを取得するものが他にないことを、自分自身を安心させるために非常に簡単にします。