マルチスレッド同時ソリューション(原子変数の使用)
1832 ワード
次に、制御されていない同時カウンタを示します.
出力を実行するたびに、次のような結果が異なります.
Javaメモリモデルの観点から、簡単なcounter++の実行過程は、第1歩、メインメモリにcounterの値をロードしてスレッドワークメモリの第2歩、プラス1演算の第3歩を実行し、第2歩の実行結果をワークメモリからメインメモリに書き込む
同時発生を予防するために、原子変数javaを用いることができる.util.concurrent.atomicパッケージの下のクラス
ここで、自己増減方法の説明:incrementAndGet()は、新しい値(すなわち、1を加えた値)getAndIncrement()を返し、古い値(すなわち、1を追加する前の元の値)を返します.
decrementAndGet()は、新しい値(つまり1を減らした値)getAndDecrement()を返し、古い値(つまり1を減らす前の元の値)を返します.
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を減らす前の元の値)を返します.