同步块不同步Java阵列列表

时间:2014-08-17 07:54:57

标签: java concurrency

我有一个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();
   ...
}

1 个答案:

答案 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());
                }
            }

        }

    }