zoukankan      html  css  js  c++  java
  • JAVA CopyOnWriteArrayList 说明

    对读写锁规则的升级

    CopyOnWriteArrayList 的思想比读写锁的思想又更进一步。为了将读取的性能发挥到极致,CopyOnWriteArrayList 读取是完全不用加锁的,更厉害的是,写入也不会阻塞读取操作,也就是说你可以在写入的同时进行读取,只有写入和写入之间需要进行同步,也就是不允许多个写入同时发生,但是在写入发生时允许读取同时发生。这样一来,读操作的性能就会大幅度提升。

    特点

    CopyOnWrite的含义

    从 CopyOnWriteArrayList 的名字就能看出它是满足 CopyOnWrite 的 ArrayList,CopyOnWrite 的意思是说,当容器需要被修改的时候,不直接修改当前容器,而是先将当前容器进行 Copy,复制出一个新的容器,然后修改新的容器,完成修改之后,再将原容器的引用指向新的容器。这样就完成了整个修改过程。

     

    这样做的好处是,CopyOnWriteArrayList 利用了“不变性”原理,因为容器每次修改都是创建新副本,所以对于旧容器来说,其实是不可变的,也是线程安全的,无需进一步的同步操作。我们可以对 CopyOnWrite 容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素,也不会有修改。

     

    CopyOnWriteArrayList 的所有修改操作(add,set等)都是通过创建底层数组的新副本来实现的,所以 CopyOnWrite 容器也是一种读写分离的思想体现,读和写使用不同的容器。

    如下代码: CopyOnWriteArrayList 用法

    创建多线程,循环10个线程池
    CopyOnWriteArrayList<StudentInfo> listResult = new CopyOnWriteArrayList<>();
    CountDownLatch latch = new CountDownLatch(
    Student.size()
    );
    for (SelectionInfo selectionInfo : Student.size()) {
    globalThreadPoolExecutor.submit(() -> {

    String response=Function();// system.out.print("do something();");
            if (ObjectUtils.isEmpty(response) || !response.getIsSelectionSuccess()) {
    latch.countDown(); //这里计数器需要变化
    return;
    }


    listResult.add(response);
    latch.countDown(); //这里计数器需要改变
    });
    }
    latch.await();
    return listResult;
    团队五人,专业从事软件开发,接单工作,专注于Java,.Net,PHP
  • 相关阅读:
    CorelDRAW X8完全学习教程
    Linux环境编程:从应用到内核
    Excel 2010 VBA 入门与实战
    iOS 用GDataXMLNode创建和解析XML
    iOS 使用SBJSON创建和解析JSON
    [iOS]MD5加密字符串
    Read and Write NSArray, NSDictionary and NSSet to a File
    ASIHTTPRequest类库简介和使用说明
    ios 调用webservice整理
    数据库迁移(SQL SERVER导入数据到MySql)
  • 原文地址:https://www.cnblogs.com/xiaohouye/p/14708518.html
Copyright © 2011-2022 走看看