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.

  • 相关阅读:
    010editor爆破与注册机
    [FlareOn4]notepad
    [FlareOn6]Snake(NES逆向)
    [FlareOn6]Memecat Battlestation
    [FlareOn6]FlareBear
    回车符和换行符之间的区别
    docker配置搭建elasticsearch集群
    docker部署安装harbor
    ansible的get_url模块
    ansible的lineinfile与blockinfile模块
  • 原文地址:https://www.cnblogs.com/jiuya/p/13806498.html
Copyright © 2011-2022 走看看