两个线程使用两个列表还是一个同步列表更好?

问题描述 投票:0回答:2

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

java multithreading synchronized
2个回答
0
投票

选项2


0
投票

选项1无效。在您看来,您已经创建了2个列表,但是此行list1=list2不会将list1复制到list2,它将更改指向同一数组上的指针。如果要将list1复制到list2,它将强制您遍历list1,并且将获得并发的读写异常。

© www.soinside.com 2019 - 2024. All rights reserved.