0
伯爵「這個」 elasped時間下同步的增量方法是:20000經過時間:5001兩個線程調用比預期
我得到這樣的結果,當我鍵入下面的代碼,我有一個具有計數的類變量在「this」的同步塊中增加,爲什麼當我在main中創建一個新的Exercise對象,然後2個線程使用2 anon runnable的調用ex.increment時,它只需要5秒?不應該總共爲10秒,因爲一個線程獲得一個鎖並且它在另一個應該等待的時候工作嗎?我得到同步的想法,但我只是困惑,爲什麼如果我要使練習實現可運行並將其傳遞給Thread()構造函數,它將需要10秒,但不是這樣,請解釋謝謝。
public class Exercise {
private int count = 0;
public int getCount() {
return count;
}
public void increment() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
for (int i = 0; i < 10000; i++) {
count++;
}
}
}
}
public class App {
public static void main(String[] args) {
Exercise ex = new Exercise();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
ex.increment();
}
});
long start = System.currentTimeMillis();
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("Count is: " + ex.getCount() + " Time elapsed: " + (end - start));
}
}
_When_是獲得的鎖嗎?睡覺之前或之後?換句話說,睡眠呼叫是並行執行還是一個接一個地執行? –
等待,所以你說的是方法同時睡5秒,而同步的塊實際上是在5秒之外連續執行的。 – Calyxander
他們有什麼理由等待彼此? –