如果使用ThreadPoolExecutor
執行Runnable,並且如果此Runnable修改某個共享狀態,是否可以保證在原始線程中這些共享狀態的更改是否可見提交可運行池到池?假設只有1位作者共享狀態和1位讀者。我知道,當您使用ExecutorService
返回Future
時,執行Future.get()
將保證可見性。使用ThreadPoolExecutor.execute()執行內存可見性保證
class State {
private int x;
public State(int y) { x = y; }
public void setX(int y) { x = y; }
public int getX() { return x; }
}
main() {
threadPool = new ThreadPoolExecutor(8, 16, 100, TimeUnit.SECONDS, new ArrayBlockingQueue(...))
final State myState = new State(1);
threadPool.execute(new Runnable() {
public void run() {
myState.setX(50);
}
});
while (true) {
if (myState.getX() == 50) {
break;
}
sleep();
} // would this loop terminate?
}
謝謝 - 這對我有意義。我上面的例子實際上有點做作。我看到的原始代碼實際上啓動了一大堆針對線程池的異步任務。這些任務可能會更新某些狀態。主線程只是在一個緊密的循環中輪詢狀態並做一些工作。它不必顯式等待任務完成。我將編輯我的代碼示例以反映此情況。 – Harish
如果您通過某種理智的線程間信號設備(如事件)輪詢狀態,則信號設備可能保證,如果線程X看到線程Y的事件/信號,它還會看到線程X在發送之前發生的任何內存更改信號或事件。只是不要假裝它 - 使用正確的信號/同步設備。 –