您可以複製粘貼下面的示例以在本地計算機上運行。我正在學習MultiThreading,並在線查看了這個例子。我很困惑,爲什麼添加的方法(在類Counter中)如果聲明爲同步時會有所作爲,則可以從中刪除同步的關鍵字,並且不會影響最終結果,因此我只是想知道服務的目的是什麼宣佈它同步在以下示例中聲明一個同步方法的目的是什麼
class Counter {
long count = 0;
public synchronized void add(long value) {
this.count += value;
System.out.println(count + "-" + Thread.currentThread().getName());
}
}
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++) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(CounterThread.class.getName()).log(Level.SEVERE, null, ex);
}
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);
Thread threadC = new CounterThread(counter);
threadA.start();
threadB.start();
threadC.start();
}
}
如果刪除了睡眠,並提高到100000000次迭代左右(所以它不會只是完成瞬間),並在最後打印計數器的值(主線程加入其他線程)之後,你會看到有所不同。 – immibis 2014-12-19 05:23:19
@immibis是的,我做了一個類似的實驗,最終的結果是不是一件預期。 – 2014-12-19 05:52:01