zoukankan      html  css  js  c++  java
  • 多线程情况下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.

  • 相关阅读:
    消息队列设计
    抓包工具Fiddler
    分布式系统和CAP
    Topshelf组件
    Parallel.For
    MVC插件
    Azure Messaging-ServiceBus Messaging
    MVC
    requireJS
    第一次react-native项目实践要点总结 good
  • 原文地址:https://www.cnblogs.com/jiuya/p/13806498.html
Copyright © 2011-2022 走看看