未同步Java数组列表的同步块



我有一个Java ArrayList,它同时被500多个线程使用。由于某些原因,同步块不能确保Java Array List上的同步。我知道ArrayList是非线程安全的,即。,它们不同步。然而,我认为通过将列表包装到一个同步块中可以实现这一点。不幸的是,在极少数情况下(但在某些情况下),两个或多个线程同时进入同步块,这给了我不确定的行为。我错过什么了吗?我如何保证我的数组列表(或任何其他列表集合)在500多个同时在数组中操作的线程中是完全线程安全的呢?

有一个相关的问题,(在java中同步ArrayList的正确方法),但我不明白它的答案。我应该在每次"运行"线程时创建一个同步集合吗?

示例:

线程1

synchronized (_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());
                }
            }
        }
    }

最新更新