我在一些OSS單元測試中很頻繁地看到這段代碼,但它是否安全? while循環保證能夠看到invoc的正確值嗎?是java中整數線程安全讀取的不同步嗎?
如果否;書呆子指向誰也知道哪個CPU架構可能會失敗。
private int invoc = 0;
private synchronized void increment() {
invoc++;
}
public void isItThreadSafe() throws InterruptedException {
for (int i = 0; i < TOTAL_THREADS; i++) {
new Thread(new Runnable() {
public void run() {
// do some stuff
increment();
}
}).start();
}
while (invoc != TOTAL_THREADS) {
Thread.sleep(250);
}
}
不能說100%,但它看起來像非易失性字段的非同步讀取不保證讀取'invoc'的最近值(即使* *刷新*由於'increment()'方法中的''synchronized''關鍵字。)儘管如此,不太瞭解Java內存模型足以說明問題。 – dlev
@dlev就是這樣的問題;) – krosenvold
我正要回答,「它一直對我有效!」。但也發現http://stackoverflow.com/questions/1006655/are-java-primitive-ints-atomic-by-design-or-by-accident其中說「是」的整數,而「也許」多頭和雙打。 –