gpt4 book ai didi

Java并发访问ArrayList

转载 作者:行者123 更新时间:2023-12-02 13:33:01 26 4
gpt4 key购买 nike

在以下代码之后

ArrayList<String> foo, bar, test;
foo = new ArrayList<String>(Arrays.asList("foo"));
bar = new ArrayList<String>(Arrays.asList("bar"));
test = new ArrayList<String>(Arrays.asList("test"));

线程 1 运行:

foo = new ArrayList<String>(bar);

线程 2 运行:

bar = new ArrayList<String>(test);

如果线程 2 在线程 1 使用 bar 时更改它的值,会导致异常吗?

最佳答案

您不会遇到并发修改异常,因为列表实例永远不会发生变化。仅交换引用。

但是您仍然存在数据竞争:

  • 要么先运行 Thread1 中的分配。 Thread1 将捕获初始 bar 对象并创建一个新的“foo”,它是该对象的副本。
  • 或者 Thread2 中的赋值将首先运行,这意味着它会创建一个存储在 bar 引用中的新列表,当 Thread1 稍后运行时,它将最终得到该列表的副本,它本身就是 test 列表的副本。

关于Java并发访问ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43117034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com