我是新手,當發現問題時發現併發和不確定自己時,我正在查看相當成熟的代碼庫,並找到了下面的代碼(爲了簡潔起見),我相信易受數據種族:多線程代碼中的非易失性狀態標誌
public class Example extends Thread {
boolean condition = false;
public void run() {
while (true) {
synchronized (this) {
try {
while(condition) wait();
}
catch (InterruptedException e) { /*for brevity*/ }
}
// non-blocking computation
}
}
public void setTrue() { condition = true; }
public void setFalse() {
synchronized (this) {
condition = false;
this.notifyAll();
}
}
}
據我理解,因爲即使在synchronized塊,編譯器不會發出任何內存屏障condition
必須是揮發性的;如果這是一個不穩定的商店condition
在setTrue
編譯器會發出StoreEnter.
我是否有權相信上述容易受到數據競爭?如果是的話,我怎麼能通過一個例子來見證數據競賽(而不是簡單地知道JMM提供的保證)。線程中隨機調用setTrue
的簡單測試不會發現數據競爭。
此外,我相信使用notifyAll在這裏是過度殺傷,因爲有一個條件來檢查,只有一個線程將永遠等待它,對嗎?
謝謝。
除非您確實有理由,否則不要擴展Thread類。最好是實現Runnable接口並向Thread構造函數提供你的類的一個實例。 – gparyani