我在期待這段代碼是線程安全的。我跑了幾次,但得到不同的結果。但是,如果我取消註釋sleep(1000)
部分,則每次打印10000次(至少從我的測試運行結果中)。這段代碼不是線程安全的嗎?
那麼,怎麼了?難道這與thread.join()
有關嗎?
public class Test implements Runnable{
private int x;
public synchronized void run(){
x++;
}
public static void main(String args[]){
Test test = new Test();
Thread thread = null;
for (int i = 0; i < 10000; i++) {
thread = new Thread(test);
try {
thread.join();
} catch (InterruptedException e) {}
thread.start();
}
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println(test.x);
}
}
編輯:哎呀,我的壞。我誤解了Thread#加入函數的方式。與run()
方法同步是一個壞主意。
爲什麼'thread.join()'在'thread.start()'之前? 'join()'表示「阻塞直到線程結束」。這隻有在線程啓動後纔有意義。 – khelwood
同步運行方法在這裏並不是真正的問題(除了主要方法直接訪問x的部分,正如我的答案指出的那樣);因爲所有線程共享同一個測試同步實例可以正常工作。 –