【发布时间】:2015-04-16 10:20:01
【问题描述】:
Thread 1: Call list.add()
Thread 1: Exits list.add()
Thread 2: Call list.get(list.size()-1)
我有一个场景,我可以保证 Thread 1 将在 Thread 2 进行 get() 调用之前完成 add() 调用。在这种情况下,Thread 2 会始终看到Thread 1 所做的更改吗?或者内部 ArrayList 变量是否需要标记为 volatile?
编辑:对于那些好奇我为什么可以保证的人。我有来自服务器的一系列事件,如下所示:
Event A1
Event A2
Event A3
Event B
事件由单个线程按顺序分派。我想捕获所有A 事件的列表,所以我的代码如下所示:
List<EventA> eventAList = new ArrayList<>();
connection.addListenerForEventAs(eventAList::add);
connection.waitForEventB();
//Here I am doing operations on the eventAList
【问题讨论】:
-
如果是多线程环境,选择
Collections.synchronizedList()或COpyOnWriteArrayList。永远不要在 多线程 中做出假设 -
@Panther,它在多处理器环境下的表现如何,而缓存恰好可以提高性能
-
你如何保证线程 1 将在线程 2 之前完成?
-
即使添加了解释,这听起来仍然很可疑。是否保证在其他线程读取列表时不添加任何事件?删除事件是否有同样的保证?
-
查看您的代码,我建议您使用
ConcurrentLinkedDeque并保留它。Collections.synchronizedList是痛苦地缓慢而CopyOnWriteArrayList是可怕的你经常写,你似乎。
标签: java concurrency java.util.concurrent