多线程情况下ArrayList 如何解决线性安全问题

问题:众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.
  并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.
  1.用老的Vector集合
  2.使用Collections.synchronizedList。它会自动将我们的list方法进行改变,最后返回给我们一个加锁了List
    protected static List<Object> arrayListSafe2 = Collections.synchronizedList(new ArrayList<Object>());

Collections.synchronizedList使用方法

List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("1");
list.add("2");
list.add("3");

synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext()) {
        //foo(i.next());
        System.out.println(i.next());
    }
}

为什么add()不需要synchronized,而遍历的时候需要加synchronized?

  因为add()等方法的时候是加了synchronized关键字的,但是listIterator(),iterator()却没有加.所以在使用的时候需要加上synchronized.

posted @ 2020-10-13 01:19  九涯  阅读(500)  评论(0编辑  收藏  举报