[英]Thread-Safe ArrayList merge: will this work?
private static final ExecutorService ES = Executors.newWorkStealingPool();
public Future<List<String>> isThisSafe() {
List<String> a = new ArrayList<>();
a.add("a");
List<String> b = new ArrayList<>();
b.add("b");
return ES.submit(() -> {
a.addAll(b);
return a;
});
}
我會說線程 X 是調用 isThisSafe() 的線程。 線程 Y 運行提交給 ExecutorService 的 Callable。
現在,我認為這行得通。
✓ 這兩個 ArrayList 發布到 Y 后,再也不會被 X 修改
✓ ArrayList 'a' 被線程 Y 修改,但 X 不包含對 'a' 的引用。返回的對 'a' 的引用將被視為'新',因此 X 將從 MM 中提取它。
但是我的第二點有問題嗎? 也許我誤解了 memory model。
線程 X 安全地將 object a
發布到線程 Y 並且在 Y 成功之前不做任何修改。 所以 object a
從線程 X 安全地發布到線程 Y。
此外,線程中的所有操作都發生在任何其他線程從該線程上的Future.get()
成功返回之前。 從Future.get()
返回后,線程 X 可以看到線程 Y 對 object a
所做的所有更改。
所以根據我們的線程安全分析,我們可以斷定這段代碼是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.