以下のコードがスレッドセーフではない理由を教えてください。取得する出力は、0 または 45 または 90 のいずれかです。共有リソース カウンターには同期メソッドがあるため、常に出力として 90 を期待しています。ここで何か不足していますか?お知らせ下さい。このコードをスレッドセーフにする方法も教えてください。
class Counter{
long count = 0;
public synchronized void add(long value){
this.count += value;
}
}
class CounterThread extends Thread{
protected Counter counter = null;
public CounterThread(Counter counter){
this.counter = counter;
}
public void run() {
for(int i=0; i<10; i++){
counter.add(i);
}
}
}
public class Example {
public static void main(String[] args){
Counter counter = new Counter();
Thread threadA = new CounterThread(counter);
Thread threadB = new CounterThread(counter);
threadA.start();
threadB.start();
System.out.println(counter.count);
}
}