bco*_*lan 15 java concurrency java.util.concurrent
Thread 1: Call list.add()
Thread 1: Exits list.add()
Thread 2: Call list.get(list.size()-1)
Run Code Online (Sandbox Code Playgroud)
我有一个场景,我可以保证Thread 1在进行Thread 2get()调用之前完成add ()调用.将Thread 2始终看到所做的更改Thread 1在这种情况下?或者内部ArrayList变量是否需要标记为volatile?
编辑:对于那些对我能保证的原因感到好奇的人.我有一系列来自服务器的事件,如下所示:
Event A1
Event A2
Event A3
Event B
Run Code Online (Sandbox Code Playgroud)
事件由单个线程按顺序分派.我想捕获所有A事件的列表,所以我的代码看起来像这样:
List<EventA> eventAList = new ArrayList<>();
connection.addListenerForEventAs(eventAList::add);
connection.waitForEventB();
//Here I am doing operations on the eventAList
Run Code Online (Sandbox Code Playgroud)
The*_*ind 10
首先,您必须确保在add()通过thread-1调用和get()通过thread-2 调用之间存在关系之前发生.完成通话和之前发生的完全不同.
除非你这样做,否则你的代码将不是线程安全的.为什么?.Thread-1可能会add()在thread-2调用之前完成调用get().但是什么保证Thread-2不会制作列表的本地副本(保持方便)?add()方法不能确保之前发生.因此,无法保证第一个线程添加的值甚至完全写入并且对线程2可见.
使用CopyOnWriteArrayList或Collections.SynchronizedList()在多线程环境中使用.
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |