私はいくつかのJava並行性の概念と使用されているものを学び始めます。しかし、このコードの1つは私の理解を超えています。
public class Count {
private int count = 0;
public synchronized void setCount(int count) {
this.count = count;
}
public synchronized int getCount() {
return count;
}
}
class CountRunner extends Thread {
Count count;
public CountRunner(Count count) {
this.count = count;
}
public void run() {
for (int i = 1; i <= 1000; i++) {
count.setCount(count.getCount() + 1);
}
}
}
class TestCount {
public static void main(String[] args) throws Exception {
Count count = new Count();
CountRunner runnerA = new CountRunner(count);
CountRunner runnerB = new CountRunner(count);
runnerA.start();
runnerB.start();
runnerA.join(); //join statement here
runnerB.join();
System.out.println("count.getCount = " + count.getCount());
}
}
質問: 1.結果は、何度も2000を少し下回るのですが、なぜですか? 2. 2つのjoin()ステートメントを削除する場合、なぜcount.getCount = 451、さらに少ないのですか? 3. join()ステートメントを削除しても効果はないと思います。 毎回1つのオブジェクトを1つのスレッドにロックするSynchronizedメソッドをすでに持っているので? では、Synchronizedとjoin()を使用する意味は何ですか?