talosのプログラミング教室

Java Gold合格への道 ~並行処理・アトミック変数~

スポンサーリンク

こんにちは。たろすです。

今回は並行処理におけるアトミック変数について説明します。

アトミック変数とは

アトミックとは「原子の」という意味を持ちます。

並行処理におけるアトミックとは複数の処理を一つの操作として扱い、途中から介入できない性質を言います。

アトミック変数はスレッド・セーフなプログラミングを可能にします。

上記の説明ではわかりにくいと思います。

例を出してみましょう。

public class ThreadSample extends Thread {
	static private int num;

	public void run() {
		for (int i = 0; i < 100000; i++) {
			System.out.println(++num);
		}
	}
}
public class Main {

	public static void main(String[] args) {
		ThreadSample thread1 = new ThreadSample();
		ThreadSample thread2 = new ThreadSample();
		ThreadSample thread3 = new ThreadSample();

		thread1.start();
		thread2.start();
		thread3.start();
	}
}

上記のMainを実行したときの最終的なnumの値はいくつになるでしょうか。

3つのスレッドで100000回ずつインクリメントしているから300000?

そうとは限りません。

threa1とthread2が同時にnumにアクセスしてそれぞれインクリメントし、numに上書きした場合、本来2回インクリメントされているから+2されるべきところが同じ値に対してインクリメントしたため+1しかされません。


一方で、アトミック変数を使った場合どうなるか。

public class ThreadSample extends Thread {
	static private AtomicInteger num = new AtomicInteger(0);

	public void run() {
		for (int i = 0; i < 100000; i++) {
			System.out.println(num.incrementAndGet());
		}
	}
}

同じmainを実行すると必ず結果は300000になります。

これはスレッド・セーフであるから、つまりあるスレッドが変数にアクセスしているときに他のスレッドは変数にアクセスできないようになっているからです。

おわりに

今回は並行処理におけるアトミック変数について説明しました。