【发布时间】:2020-02-04 03:20:46
【问题描述】:
如果您有线程 #1 迭代列表并使用数据渲染 2d 图形,然后线程 #2 删除项目、添加项目,但主要更改该列表中项目的值,哪个选项是更好/更高效?
选项 1:
List<Object> list1 = new ArrayList<Object>();
List<Object> list2 = new ArrayList<Object>();
// Thread 2
ArrayList<Object> newData = new ArrayList<Object>();
newData.add(new Object());
list2 = newData;
// Thread 1
list1 = list2;
for (Object o : list1) {
// use data to render
}
选项 2:
List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
// Thread 2
synchronized(list) {
// add, remove, change values
}
// Thread 1
synchronized(list) {
for (Object o : list) {
// use data to render
}
}
我对它的工作原理知之甚少,但我担心在第二个选项中,线程 1 可能正在尝试迭代列表并且它被锁定,因此线程 1 运行缓慢并且这是可见的,因为它正在被渲染。非常感谢您的帮助
【问题讨论】:
-
两者都不是。如果您使用两个列表,您的第二个线程将错过更新,或者至少不清楚它们如何等同于单个列表。使用单个同步列表或同步,但这也是不够的:如果您遍历一个列表,则必须在循环外对其进行同步。
标签: java multithreading synchronized