マルチスレッドのプログラミングは慣れが必要

あんまりに並行プログラミングがわからないので、評判を参考にこんな本を買いました。(以下はAmazonアフィリエイト


しかしながら、マルチスレッドは本読んでるだけではさっぱりだなあ、と思いまして、7ページを参考にこういうコードを書いてみた。

public class Sample1 {
    public static void main(String[] args) {
	UnsafeSequence u = new UnsafeSequence();
	Th t1 = new Th(u);
	Th t2 = new Th(u);

	t1.start();
	t2.start();
	try {
	    t1.join();
	    t2.join();
	} catch (InterruptedException e) {}
    }
}

class Th extends Thread {
    private UnsafeSequence u;
    Th(UnsafeSequence _u) {
	u = _u;
    }

    public void run() {
	for (int i = 0; i < 10; i++){
	    System.out.print(u.getNext());
            System.out.print(" ");
        }
    }
}

class UnsafeSequence {
    public int nextValue;
    UnsafeSequence() {
	nextValue = 0;
    }

    public int getNext() {
	return nextValue++;
    }
}

実行結果としては「0 1 2 3 ... 17 18 19」と順番に表示されるはずもなく

1 2 3 4 5 6 7 0 8 9 10 12 13 11 15 14 16 17 18 19

のように毎回ことなる結果になる。runメソッドを以下のように書き直すとそれが治る。

    public void run() {
	for (int i = 0; i < 10; i++)
	    synchronized(u) {
		System.out.print(u.getNext());
		System.out.print(" ");
	    }
    }


なるほど、、、synchronized(this)だと動かなかった。なんでなのかまだわからないのです。