zoukankan      html  css  js  c++  java
  • Collections.synchronizedList使用方法

    ArrayList

    众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.

    Vector

    Vector是一个线程安全的List,但是它的线程安全实现方式是对所有操作都加上了synchronized关键字,这种方式严重影响效率.所以并不推荐使用Vector.

    Collections.synchronizedList(List list)

    要实现List的线程安全,可以使用 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());
        }
    }

    翻看源码Collections.synchronizedList->SynchronizedList可以发现add方法加了锁,所以add时我们就不用加锁;遍历时则避免数据被其他线程串改,所以加锁保护;

    synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,因为在整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list);

  • 相关阅读:
    创建Django项目
    CVE-2011-0104:Microsoft Office Excel 栈溢出漏洞修复分析
    HDU 1089 到1096 a+b的输入输出练习
    ocrosoft 程序设计提高期末复习问题M 递归求猴子吃桃
    HDU 1406 完数
    ocrosoft 1015 习题1.22 求一元二次方程a*x^2 + b*x + c = 0的根
    php-amqplib库操作RabbitMQ
    rabbitmq 使用PhpAmqpLib
    RabbitMQ的持久化
    Rabbitmq各方法的作用详解
  • 原文地址:https://www.cnblogs.com/luojiabao/p/11308803.html
Copyright © 2011-2022 走看看