1 回答

TA贡献2039条经验 获得超8个赞
您看不到更新的列表内容,因为增强的 for循环在幕后使用了迭代器。因此,您正在使用迭代器(到旧列表)来迭代数据(即使在分配完成之后)。这意味着这两个列表都在范围内(而不是垃圾收集)。一次,isReassigned是的,如果你得到一个迭代器,list你就可以看到新的内容。
我已经稍微更改了您的代码(添加了一个else块)以理解这一点
for (String s: list) {
System.out.println(s);
if (!isReassigned) {
new Thread(() -> reassignList()).start();
isReassigned = true;
} else {
System.out.println("Latest data " + list);
}
Thread.sleep(1000);
}
这产生
hi
Reassigning list....
there
Latest data [goodbye, old, list]
friend
Latest data [goodbye, old, list]
其他几点:
您不应该
isReassigned
从主线程进行设置。必须在分配列表后设置。正如@Kartik 在评论中指出的那样,可能存在可见性问题,其他线程可能看不到所做的更改。标记列表
isReassigned
和易失性将解决这个问题。
添加回答
举报