我有一个Java ArrayList
,它同时被500多个线程使用。由于某种原因,同步块无法确保Java阵列列表上的同步。我知道ArrayList
是非线程安全的,即,它们不同步。但是,我认为通过将列表包装到同步块中,我会实现这一点。不幸的是,在极少数情况下(但在某些情况下)两个或多个线程同时进入同步块,这给了我非确定性行为。我错过了什么吗?我怎样才能保证我的数组列表(或任何其他列表集合)在阵列中运行的500多个并发线程中完全是线程安全的。
有一个相关的问题,(Correct way to synchronize ArrayList in java),但我不明白它的答案。我应该在每次“运行”我的线程???
时创建一个同步集合样品:
线程1
synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
线程2
synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
线程n
synchronized (_myList) {
Iterator it = _myList.iterator();
...
}
答案 0 :(得分:0)
选项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());
}
}
}
}