-1

次のような値割り当てコマンドの直後に興味があります。

a = 5;

新しい値が変数に格納されているという保証はありますか? そして、これがプリミティブと他のデータ型で異なる場合は? 特に Runnable オブジェクトの場合。

以下を含む MyClass でメソッドを実行しました。

synchronized(this){ 
    while(pleaseWait){ 
        try { System.out.println("sleeping"); wait();} 
        catch (Exception e) {        e.printStackTrace(); } 
    }  
}

次を含むメソッド sleepMe() を呼び出している他のクラスです。

synchronized (myclass){
            myclass.pleaseWait = true;
            myclass.notify();
}

問題は、sleepMe を呼び出した後に待機を挿入する必要があるので、MyClass のインスタンスが myclass.pleaseWait の値を変更する時間があるかどうかです。

複雑なオブジェクト (オブジェクトのオブジェクト) を MyClass のインスタンスに割り当てるいくつかのセット メソッドがあります。

ありがとう

4

1 に答える 1

1

2 つのスレッドが同じオブジェクトで同期しているという事実は、一方のスレッドが行った変更がpleaseWait、呼び出しから戻ったときに他方のスレッドに表示されることを意味しwait()ます。同期 (この場合、呼び出しthisから戻ったときにロックを取り戻すことwait()) は、2 つのスレッド間に必要な「前に起こる」関係を提供し、更新が確実に表示されるようにします。

あなたの質問に答えるには:

  • どのソリューションでも、ある意味で「待機」するスレッドが 1 つ必要です。それは問題に内在しています。

  • あなたがしていることは十分です。追加の待機を追加する必要はありません。wait()待機/通知メカニズムにより、オブジェクトのロックを保持している間にすべての変更が行われた場合、変数の最新のコピーを確認するスレッドが保証されます。

  • より高いレベルの同時実行クラスを使用して、この種のものを実装することもできます。

  • と「ビジー待機」を使用してこれを実装することもできvolatileます...しかし、それは本当に悪い考えです。

于 2013-05-04T14:23:49.270 に答える