我有一个Java ArrayList
,它同时被500多个线程使用。由于某些原因,同步块不能确保Java Array List上的同步。我知道ArrayList
是非线程安全的,即。,它们不同步。然而,我认为通过将列表包装到一个同步块中可以实现这一点。不幸的是,在极少数情况下(但在某些情况下),两个或多个线程同时进入同步块,这给了我不确定的行为。我错过什么了吗?我如何保证我的数组列表(或任何其他列表集合)在500多个同时在数组中操作的线程中是完全线程安全的呢?
有一个相关的问题,(在java中同步ArrayList的正确方法),但我不明白它的答案。我应该在每次"运行"线程时创建一个同步集合吗?
示例:线程1synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
线程2 synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
线程n synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
选项1:
使用自定义锁:Object lock = new Object();
并同步这个锁上的东西,比如:
synchronized(lock) {
//operations on array list
}
选项2:
使用java.util.Collections.synchronizedList()
参考以下代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class SynchronizedListExample {
public static void main(String[] args) {
List<String> syncList = Collections.synchronizedList(new ArrayList<String>());
syncList.add("one");
syncList.add("two");
syncList.add("three");
// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (syncList) {
Iterator<String> iterator = syncList.iterator();
while (iterator.hasNext()) {
System.out.println("item: " + iterator.next());
}
}
}
}