簡體   English   中英

線程安全的 ArrayList 合並:這可行嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM