如果您有线程 #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 运行缓慢并且这是可见的,因为它正在被渲染。非常感谢你的帮助