thread of same instanceを大量発行する
本来
0を読み出し+100
100を読み出し+100
で200となるはずが、
読み出しタイミング同時だと
0を読み出し+100
0を読み出し+100
で100となる
class RunnableSampleClass implements Runnable {
int num;
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(RunnableSampleClass.class.getName()).log(Level.SEVERE, null, ex);
}
add();
}
void add() {
num = num + 100;
}
}
public class Outer {
public static void main(String[] args) {
ExecutorService e = Executors.newFixedThreadPool(10);
for(int i=0; i<10; i++) {
RunnableSampleClass r = new RunnableSampleClass();
e.submit(r);
e.submit(r);
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(Outer.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(r.num);
}
e.shutdown();
}
}
200
200
200
200
200
100
200
100
200
200
排他制御フィールドはRunnableSampleClass。つまりthis。
排他制御対象処理はaddメソッド
synchronizedをつけて、排他制御フィールドをつかめるのは1つのスレッドだけとする。つかめた1スレッドだけが排他制御対象処理を実行。
synchronized void add() {
num = num + 100;
}
結果がすべて200になった。
200
200
200
200
200
200
200
200
200
200