マルチスレッドのプログラミングは慣れが必要
あんまりに並行プログラミングがわからないので、評判を参考にこんな本を買いました。(以下は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)だと動かなかった。なんでなのかまだわからないのです。