我有一個實現可運行的線程類和一個int計數器作為實例變量。兩種同步方法add和sub。當我以某種方式運行測試類時,它幾次會輸出錯誤的結果。據我了解,當方法同步時,整個對象將被鎖定以供其他線程訪問,這種邏輯每次我們都應該獲得相同的結果正確嗎?事實并非如此。我想念什么嗎?
我的機器是Windows 7、64位。
public class ThreadClass implements Runnable {
int counter = 0;
@Override
public void run() {
add();
sub();
}
public synchronized void add() {
System.out.println("ADD counter" + (counter = counter + 1));
}
public synchronized void sub() {
System.out.println("SUB counter" + (counter = counter - 1));
}
}
測試類
public class ThreadTest {
public static void main(String args[]) {
ThreadClass tc = new ThreadClass();
Thread tc0 = new Thread(tc);
tc0.start();
tc0.setPriority(Thread.MAX_PRIORITY);
Thread tc1 = new Thread(tc);
tc1.start();
tc1.setPriority(Thread.NORM_PRIORITY);
Thread tc2 = new Thread(tc);
tc2.start();
tc2.setPriority(Thread.MIN_PRIORITY);
}
}
結果
ADD counter1
ADD counter2
SUB counter1
SUB counter0
ADD counter1
SUB counter0
注意: 您可能需要進行幾次運行才能產生這種不一致。