如果线程#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被锁定,因此线程1运行缓慢,这是可见的,因为正在渲染它。非常感谢您的帮助
选项2
选项1无效。在您看来,您已经创建了2个列表,但是此行list1=list2
不会将list1复制到list2,它将更改指向同一数组上的指针。如果要将list1复制到list2,它将强制您遍历list1,并且将获得并发的读写异常。