I持って、次のコードのJavaスレッド同期方法
import java.util.concurrent.*;
public class dsd {
private static boolean stopRequested;
private static void requestStop() {
stopRequested = true;
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
public static void main(String[] args)
throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested())
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
それはrequestStop()
が同期されていない場合でも動作しますなぜ質問はありますか?私がstopRequested()
に同じことをしようとすると、もう動作しません。その変数のスレッドの並行性に問題はないのはなぜですか?私は、同期によって、変数が他のスレッドによって一貫した状態で表示されることがわかります。しかし、ここで変数は同期されておらず、それは効果がないようです。
_...なぜ動作するのですか..._あなたが「働く」ことを意味すると助けになるでしょう。これは必ずしも明白ではありません。特に、あなたのようなプログラムでは出力が出ません。私は、「働く」とは、1秒後にすぐにプログラムが停止することを意味していると思っています。 –
あなたは必要な振る舞いを保証するために同期化(または揮発性)が必要ですが、持っていなければ幸運であればそれを得ることができます(このような小さなプログラムは運が楽になります)。言い換えれば、「あなたが保証されているわけではありません.X」は、「あなたがXではないことを保証しています」とは異なります。 – yshavit
_ stopRequested()に同じことをしようとすると... _同じことをしようとするとどうなりますか?あなたがしたことは何ですか?あなたは何をしましたか? 'stopRequested()'の宣言に 'synchronized'を追加すると言っていますか? –