CopyOnWrite容器

1.简介

    

    1.CopyOnWrite是程序优化的策略,当共享的内容需要修改时,复制出去一份进行修改,然后将原来的引用指向修改完的

      2.java并发包(java.util.concurrent)中CopyOnWriteArrayList和CopyOnWriteArraySet实现了这个并发容器

    3.好处:因为写时是在复制的一份上操作,所以可以并发的读,不需要加锁,是读写分离的思想,在并发场景中使用

2.CopyOnWriteArrayList的实现原理

    CopyOnWriteArrayList是一个线程安全,读操作时无锁的ArrayList\

    //构造函数,初始容量为0的数组

     public CopyOnWriteArrayList() {
          setArray(new Object[0]);
      }

    //添加新元素

    public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);//复制到一个新数组中,容量+1
            newElements[len] = e;//添加新元素
            setArray(newElements);//将原数组的引用指向新数组
            return true;
        } finally {
            lock.unlock();
        }
    }

  //读操作,不加锁

   public E get(int index) {

    return (E) (getArray()[index]);

    }

3.CopyOnWrite的缺点:占用内存,因为要复制一份,可以压缩元素方法减少内存,当元素时10进制数时,压缩成64进制或者使用其            他并发容器 ConcurrnetHashMap

            并发操作,读不到最新写入的数据,数据不一致

总结:线程安全,读操作不需要加锁

   底层数据结构是Object[]数组,默认大小0.每次添加元素,容量+1,数组复制一遍

  增删改上锁,读不上锁

  遍历是遍历的全局数组的一个副本,不会发生并发异常

  读多写少的情况且脏读的影响不大的并发情况,选择使用CopyOnWriteArrayList

   

 

转载于:https://www.cnblogs.com/2nao/p/6487290.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Akka的字数统计MapReduce

在我与Akka的日常工作中,我最近写了一个字数映射表简化示例。 本示例实现了Map Reduce模型,该模型非常适合横向扩展设计方法。 流 客户端系统(FileReadActor)读取文本文件,并将每一行文本作为消息发送给ClientActor。…

mysql如何设置多节点_详细介绍Mysql5.7从节点设置多线程主从复制的办法

软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功…

python学习笔记 可变参数关键字参数**kw相关学习

在Python中可以定义可变参数,顾名思义,可变参数就是传入参数是可变的。可以是任意个,以一个简单的数学编程为例,计算 sum a * a b * b .....z * z 函数定义可以如下: def getsum(num) :sum 0for n in num :sum su…

Struts2之环境配置

在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计。在这儿MVC模式的好处就不在提了。 技术优势 Struts2有两方面的技术优势,…

mysql数据库备份shell_mysql数据库备份shell脚本分享

#!/bin/bash#2020年04月27日15:56:21#auto backup mysql db#by author www.cnbugs.com########################SQL_DB"$*"SQL_USR"backup"SQL_PWD"123456"SQL_CMD"/usr/bin/mysqldump"SQL_DIR"/data/backup/date %F"if [ $…

懒惰的JSF Primefaces数据表分页–第1部分

今天,我们将使用带有视图范围的托管bean的惰性列表进行JSF数据表分页。 这些单词/表达式是什么意思? 如今,有几个JSF框架为数据表提供现成的分页,列排序器和其他功能。 今天,我们将使用Primefaces数据表。 通常&#…

java 动态增加定时任务

直接上代码 import org.apache.tools.ant.util.DateUtils; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory;import java.util.Calendar; import…

基于JavaFX的SimpleDateFormat演示程序

对于使用Java Date进行格式化的新手甚至对于使用Java Date进行格式化的有经验的Java开发人员而言,可能有些棘手的事情是使用SimpleDateFormat规范日期/时间格式。 SimpleDateFormat的基于类级别的Javadoc的文档非常详尽,涵盖了表示日期/时间的各个组成部…

mysql中预定义常量_PHP预定义常量

这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模块。PHP_VERSION (string)PHP_OS (string)PHP_EOL (string)自 PHP 4.3.10 和 PHP 5.0.2 起可用PHP_INT_MAX (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用PHP_INT_SIZE (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用D…

iOS与H5交互

前提:在iOS控制器中加载UIWebView,设置代理,遵守UIWebViewDelegate协议。 一、iOS调用JS方法 通过iOS调用JS代码实现起来比较方便直接调用UIWebView的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script…

cocos2dx 3.x 蒙板 遮罩 点击圆功能

//注册触摸EventListenerTouchOneByOne *listener EventListenerTouchOneByOne::create();listener->onTouchBegan CC_CALLBACK_2(HelloWorld::onTouchBegan,this);listener->onTouchMoved CC_CALLBACK_2(HelloWorld::onTouchMoved,this);listener->onTouchEnded …

markdownTest

MARKDOWNTEST 11111111111111有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起——它就是Markdown有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起——它就是Markdown 111111111111111222222222…

python模拟密码有效性检测功能_检查密码有效性(Django/Python)

我有一个非常小的Django应用程序,主要是为了学习。我使用的是Django提供的内置用户模型。为了学习这个功能,我创建了一些页面,这些页面允许我创建和编辑用户,而不必进入管理面板。在register页面允许我非常容易地检查密码和电子邮…

教程:Hibernate,JPA –第1部分

这是关于使用Hibernate和JPA的教程的第一部分。 这部分是对JPA和Hibernate的介绍。 第二部分将研究使用Spring ORM组合Spring MVC应用程序以减少创建CRUD应用程序所需的代码量。 为此,您需要熟悉Maven,JUnit,SQL和关系数据库。 依存关系 首…

TCP、UDP套接字的数据传输

tcp发送数据&#xff1a; 1 #include <sys/types.h> 2 #include <socket.h> 3 ssize_t send(int sockfd,const void *msg,size_t len,int flags); 函数send只能对面向连接的套接字使用。参数sockfd为已经建立好连接的套接字描述符。参数msg指向待发送数据的缓冲区&…

Windows下用PIP安装scipy出现no lapack/blas resources found

Windows下升级了pandas&#xff0c;但是发现scipy包随后引用出错&#xff0c;后来确认需重新安装scipy&#xff0c; 在用PIP安装scipy出现no lapack/blas resources found的错误&#xff0c;具体原因可参考 这里。 后来找到一种简便的解决方案&#xff0c;只要在网站 Unofficia…

Aleri –复杂事件处理

Sybase的Aleri流媒体平台是CEP市场中最受欢迎的产品之一。 它在Sybase的交易平台RAP版本中使用&#xff0c;该版本在资本市场中广泛用于管理投资组合中的头寸。 今天&#xff0c;在这个由多个部分组成的系列文章的第一个部分中&#xff0c;我希望提供Aleri平台的概述&#xff0…

python版本回退_Python爬虫之BeautifulSoup解析之路

上一篇分享了正则表达式的使用&#xff0c;相信大家对正则也已经有了一定的了解。它可以针对任意字符串做任何的匹配并提取所需信息。但是我们爬虫基本上解析的都是html或者xml结构的内容&#xff0c;而非任意字符串。正则表达式虽然很强大灵活&#xff0c;但是对于html这样结构…

0615 团队第二阶段贡献

0615 团队第二阶段贡献 列志华http://www.cnblogs.com/liezhihua/ 26% 组长 黄柏堂 http://www.cnblogs.com/huang123/ 22% 团队 韩麒麟 http://www.cnblogs.com/hanqilin/ 26% 团队 王俊杰 http://www.cnblogs.com/wangjunjie123/ 28%团队posted on 2016…

WebStorm 运行Rect Native 项目

今天教大家如何直接使用WebStorm这个IDE直接完成编码运行项目工作.这样就可以不用打开Xcode了. 1.首先点击WebStorm右上方的下拉箭头弹出的Edit Configurations.... 2.然后会进入一个配置页面.点击左上方的.在弹出的列表中选中npm.如图. 3.在右边的配置框中,先选择Command为hel…