【发布时间】:2019-02-12 04:24:40
【问题描述】:
我正在使用在 ArrayList 上运行的两个线程。我知道您不能在迭代时修改列表,但 Java 让我在循环中重新分配(替换)整个列表,没有问题。这是线程安全的吗?
public class Main {
static List<String> list = Arrays.asList("hi", "there", "friend");
public static void main(String... args) throws InterruptedException {
boolean isReassigned = false;
for (String s: list) {
System.out.println(s);
if (!isReassigned) {
new Thread(() -> reassignList()).start();
isReassigned = true;
}
Thread.sleep(1000);
}
}
public static void reassignList() {
System.out.println("Reassigning list....");
list = Arrays.asList("goodbye", "old", "list");
}
}
我预计在“hi”之后会出现并发问题,但我得到了“hi there friend”。
我认为这是可行的,因为 Java 会在引用上按值复制,但我担心我的生产应用程序每 1 分钟重新分配一次数组可能有一天会崩溃。谢谢大家!
【问题讨论】:
-
设为
volatile,你应该会没事的。
标签: java multithreading list