マルチスレッド同時ソリューション(原子変数の使用)

1832 ワード

次に、制御されていない同時カウンタを示します.
public class Counter implements Runnable {  
private static int count;  
    
public void run() {  
    System.out.println(Thread.currentThread().getName() + ":" + (++count));  
    }  
          
public static void main(String[] args){  
    Counter counter = new Counter();  
    Thread t1 = new Thread(counter);  
    Thread t2 = new Thread(counter);  
        Thread t3 = new Thread(counter);  
    Thread t4 = new Thread(counter);  
    t1.start();  
    t2.start();  
    t3.start();  
    t4.start();  
    }  
}  

出力を実行するたびに、次のような結果が異なります.
    Thread-1:2  
    Thread-0:1  
    Thread-2:3  
    Thread-3:3  

Javaメモリモデルの観点から、簡単なcounter++の実行過程は、第1歩、メインメモリにcounterの値をロードしてスレッドワークメモリの第2歩、プラス1演算の第3歩を実行し、第2歩の実行結果をワークメモリからメインメモリに書き込む
同時発生を予防するために、原子変数javaを用いることができる.util.concurrent.atomicパッケージの下のクラス
    public class Counter implements Runnable {  
        private final AtomicInteger count = new AtomicInteger(0);  
          
        public void run() {  
            System.out.println(Thread.currentThread().getName()   
                    + ":" + count.incrementAndGet());  
        }  
          
        public static void main(String[] args){  
            Counter counter = new Counter();  
            Thread t1 = new Thread(counter);  
            Thread t2 = new Thread(counter);  
            Thread t3 = new Thread(counter);  
            Thread t4 = new Thread(counter);  
            t1.start();  
            t2.start();  
            t3.start();  
            t4.start();  
        }  
    }  

ここで、自己増減方法の説明:incrementAndGet()は、新しい値(すなわち、1を加えた値)getAndIncrement()を返し、古い値(すなわち、1を追加する前の元の値)を返します.
decrementAndGet()は、新しい値(つまり1を減らした値)getAndDecrement()を返し、古い値(つまり1を減らす前の元の値)を返します.