0

スレッドセーフなプログラムの書き方と、スレッドセーフでないコードの評価方法を学んでいます。

複数のスレッドで実行されたときにクラスが正しく機能する場合、そのクラスはスレッドセーフであると見なされます。

私の Counter.java はスレッドセーフではありませんが、出力は 3 つのスレッドすべてで 0 から 9 まで期待どおりに出力されました。

誰でも理由を説明できますか? スレッドセーフはどのように機能しますか?

public class Counter {

    private int count = 0;

    public void increment() {
        count++;
    }

    public void decrement() {
        count--;
    }

    public void print() {
        System.out.println(count);
    }

}

public class CountThread extends Thread {
    private Counter counter = new Counter();

    public CountThread(String name) {
        super(name);
    }

    public void run() {
        for (int i=0; i<10; i++) {
            System.out.print("Thread " + getName() + " ");
            counter.print();
            counter.increment();
        }
    }

}

public class CounterMain {

    public static void main(String[] args) {
        CountThread threadOne = new CountThread("1");
        CountThread threadTwo = new CountThread("2");
        CountThread threadThree = new CountThread("3");

        threadOne.start();
        threadTwo.start();
        threadThree.start();
    }

}
4

4 に答える 4

9

3 つのスレッドCounterで共有されるのではなく、各スレッドに固有のCounter

于 2013-04-06T14:34:35.137 に答える