【发布时间】:2014-03-10 00:12:06
【问题描述】:
我很少有 ArrayList<T> 包含用户定义的对象(例如 List<Student>, List<Teachers>)。这些对象本质上是不可变的,即没有提供设置器 - 而且,由于问题的性质,“没有人”会尝试修改这些对象。一旦填充了“ArrayList”,就不允许/可能进一步添加/删除对象。所以 List 不会动态变化。
在这样的给定条件下,这个数据结构(即ArraList)是否可以被多个线程(同时)安全地使用?每个线程只会读取对象属性,但不可能进行“设置”操作。
所以,我的问题是我可以依靠ArrayList 吗?如果没有,在这种情况下可以使用哪些其他更便宜的数据结构?
【问题讨论】:
-
如果对象不可能从不同的线程改变其状态,那么可能是什么问题?也许我读错了这个问题,但这似乎是一个明智的选择。唯一的问题可能是任何 ArrayList 元素的状态是否可以更改。我不会将列表传递给其他对象,而是将列表的深层副本或完全封装和保护列表的类的对象。
-
是的,你可以。试试看。
-
您可能仍需要某种同步来确保初始化列表的写入 happen-before 读取,其中 happen-before 指concept defined in the JLS,否则您可能会遇到缓存一致性或指令重新排序问题,导致其他线程看到列表部分构建。
标签: java multithreading arraylist