1. ホーム
  2. java

[解決済み] 同期化されたメソッドを別の同期化されたメソッドから呼び出しても安全ですか?

2023-05-08 09:57:41

質問

synchronizedメソッドが別のsynchronizedメソッドを呼び出した場合、スレッドセーフになりますか?

void synchronized method1() {
     method2()
}

void synchronized method2() {
}

どのように解決するのですか?

はい、メソッドを synchronized としてマークした場合、本当にそうしていることになります。

void method1() {
    synchronized (this) {
        method2()
    }
}

void method2() {
    synchronized (this) {
    }
}

スレッドコールがメソッド1からメソッド2に入ったとき、そのスレッドコールのロックが this へのロックを保持していることを確認し、それを通過することができます。

スレッドが直接メソッド1やメソッド2に入ると、ロックを取得できるまでブロックされます ( this ) を取得するまでブロックし、その後、入力します。

コメントでJames Blackが指摘したように、メソッド本体の中で何をするのかに注意する必要があります。

private final List<T> data = new ArrayList<T>();

public synchronized void method1() {
    for (T item : data) {
        // ..
    }
}

public void method3() {
    data.clear();
}

突然、スレッドセーフでなくなるのは、あなたが見ているのが ConcurrentModificationException を使用しているため、将来的には method3 は非同期であるため、 スレッド B が method1 .