-1
public class suspendCheck extends Thread{

    int t ;

    public static void main(String args[]) throws InterruptedException {
        suspendCheck as = new suspendCheck();

        Thread t2 = new Thread(as);
        t2.start();
        Thread t3 = new Thread(as);
        t3.start(); }

    public void run(){
        if(t==0){
        System.out.println("JAVA Develper");
        t= ++t;
        }
        else{

            System.out.println("JAVA Test");
            }

        }
}

このプログラムを複数回実行すると、違いと矛盾が生じます。

いつもの:

JAVA Develper
JAVA Develper

そして時折:

JAVA Develper
JAVA Test

私はこれにぞっとします。どこで私は間違えましたか?

4

4 に答える 4

7

はい、許容されます。ここで唯一恐ろしいのは、スレッドの制限を知らずにスレッドを使用しようとすることです。

これは、1 つのスレッドで簡単に実行できます。ここは安全な道を歩むことができます。

スレッドは、最適化と順序付けに関して何も保証しません。本当に int を適切に変更したい場合は、それvolatileを作成するか、AtomicInteger. さらに優れた制御が必要な場合は、ロックやsynchronizedブロックを使用してください。

この場合、tvolatile として宣言し、tまたは AtomicInteger へのアクセスを同期し、そのクラスのメソッドを使用して にアクセスしますt

今後の参考として、関連するすべての警告を読まずにこれらのようなことを試みると、死亡、窒息、悪寒、発熱、溺水、感染、吐き気、および非常に高価な機械の制御不能につながる可能性があります。

于 2013-09-01T08:21:08.843 に答える
1

競合状態で読む必要があるヘキサフラクションの回答に追加したいだけです:

そして、コードで行ったことは、複数のスレッドを作成して整数を取得し、そのうちの 1 つがそれを変更している間に他のスレッドがそれを取得し、最初のスレッドによって指定された値をオーバーライドするように変更することであると説明するスレッド。それがあなたがこの振る舞いを得ている理由です

Java の競合状態は、同時に複数のスレッドによるプログラムの並列実行が原因でプログラムに導入される並行性のバグまたは問題の一種です。Java はマルチスレッド プログラミング言語であるため、Java では競合状態のリスクが高くなります。競合状態の原因とそれを回避する方法を明確に理解する必要があります。

于 2013-09-01T08:28:39.627 に答える