此問題來自共享java資源的部分。通過使任務取決於非任務對象來避免競爭條件
請注意,在此示例中,可以取消的類不是可運行的。相反,所有依賴於IntGenerator對象的EvenChecker任務都會測試它,以確定它是否被取消,如run()所示。
而且
例如,任務不能依賴於另一項任務,因爲任務 關機順序是不能保證。 在這裏,通過使任務取決於一個 非任務對象,我們消除潛在的競爭條件。
如何理解?
public abstract class IntGenerator {
private volatile boolean canceled = false;
public abstract int next();
public void cancel() { canceled = true; }
public boolean isCanceled() { return canceled; }
}
public class EvenChecker implements Runnable {
private IntGenerator generator;
private final int id;
public EvenChecker(IntGenerator g, int ident) {
generator = g;
id = ident;
}
public void run() {
while(!generator.isCanceled()) {
int val = generator.next();
if(val % 2 != 0) {
System.out.println(val + " not even!");
generator.cancel();
}
}
}
// ...
}
解釋很不明確 - 如果你對併發感興趣,我會建議找一本更好的書。 (我還會注意到,在99%的情況下,沒有理由有一個布爾標誌來取消任務--Java提供了一個本地中斷機制)。 – assylias