首页 > 编程语言 >jdk并发包 CopyOnWriteArrayList源码分析

jdk并发包 CopyOnWriteArrayList源码分析

时间:2023-04-25 20:31:47浏览次数:41  
标签:index elements lock Object len CopyOnWriteArrayList 源码 发包 newElements


CopyOnWriteArrayList是jdk1.5并法包里面用于处理高并发下,读多写少的情况下,降低锁等待的集合类。下面对该类实现做一个简要的分析


1,首先CopyOnWriteArrayList是实现了List接口,对=List接口的相关方法进行了实现。

2,下面的它的add方法,会首先加锁,然后copy原List内部的数组,然后对新数组长度加1后释放锁。由于数组copy速度很快,切在读多写少的情况下锁开销比较少

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);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }



2,它的迭代器COWIterator不是快速失败的,下面是它的源码

private COWIterator(Object[] elements, int initialCursor) {
            cursor = initialCursor;
            snapshot = elements;
        }

        public boolean hasNext() {
            return cursor < snapshot.length;
        }

        public boolean hasPrevious() {
            return cursor > 0;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            if (! hasNext())
                throw new NoSuchElementException();
            return (E) snapshot[cursor++];
        }



3,下面是它的remove方法,加锁原理同add方法

public E remove(int index) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            E oldValue = get(elements, index);
            int numMoved = len - index - 1;
            if (numMoved == 0)
                setArray(Arrays.copyOf(elements, len - 1));
            else {
                Object[] newElements = new Object[len - 1];
                System.arraycopy(elements, 0, newElements, 0, index);
                System.arraycopy(elements, index + 1, newElements, index,
                                 numMoved);
                setArray(newElements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }




标签:index,elements,lock,Object,len,CopyOnWriteArrayList,源码,发包,newElements
From: https://blog.51cto.com/u_16088628/6225047

相关文章

  • Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、requ
    路由分发#Django支持每个应用都可以有自己独立的路由层、静态文件、模版层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中使用路由分发之前总路由直接是路由与视图......
  • Turndown 源码解析:二、规则
    规则集包含一系列规则,决定各种标签如何反编译。单个规则的格式是:{ filter:String|String[]|function(node), replacement:function(node,content,options),}filter字段用于判断节点是否适用单条规则。如果它是字符串,则判断node.nodeName===filter;如果它是字符串数......
  • 在线分销商城APP资源项目对接自助下单赚钱项目源码定制开发
    分销设置:多级分销可自定义百分比,更多分销机制讲解资源。数据管理:更简单明了管理订单售后,查询余额提现更方便。商品管理:可加虚拟商品可加价,可去重多余商品数据,一键替换,更方便管理后台商品。资源项目对接:可自己去对接更多资源的渠道,低成本高收益,管理方便,加密设置。其他更能:信息配置,分......
  • CBV源码剖析和模板层
    getattr()函数用来返回函数的一个对象属性值语法:getattr(object,name,default)object--对象。name--字符串,对象属性。default--默认返回值,如果不提供该参数,在没有对应属性时,将触发AttributeError。>>>classA(object):...bar=1...>>>a=A()>>>getatt......
  • Turndown 源码解析:一、辅助函数
    extend()Object.assign的补丁。functionextend(destination){for(vari=1;i<arguments.length;i++){varsource=arguments[i];for(varkeyinsource){if(source.hasOwnProperty(key))destination[key]=source[key];}}ret......
  • 环保家具网站源码产品展示招商加盟二开模板定制开发
    包含了网站首页;关于我们; 新闻动态;产品中心;案例展示;荣誉资质;招商加盟;联系我们;等多个版块,可以快速搭建家装设计品牌招商官网1.品牌展示:网站可以展示各种家具品牌的产品和服务,包括品牌介绍、产品展示、服务范围等,便于用户了解品牌的相关信息,帮助其选择适合自己的品......
  • 直播商城源码,PopupWindow菜单在ListView中显示
    直播商城源码,PopupWindow菜单在ListView中显示  privatePopupWindowmOperaPopup;  privatevoidshowMenuPopup(Viewanchor)  {    if(mOperaPopup==null)    {      ViewpopupView=View.inflate(mContext,R.layout.popup_opera_sub......
  • Android源码在线查看网站
    一、aospxrefhttp://aospxref.com/优点:更新速度快缺点:历史版本较少二、androidxrefhttp://androidxref.com/优点:历史版本较多缺点:更新速度慢两者可搭配使用。非常便利三、Google在线源码上面两个的平台存在如下几点问题:搜索关键字困难且不精确,特别是对有括号和“_”的......
  • 分享Python采集88个NET电子商务源码,总有一款适合您
    Python采集的88个NET电子商务源码下载链接:百度网盘请输入提取码 提取码:c0gh编辑众筹系统(RaiseDreams众筹梦想)V2.1.6云点滴客户关系管理CRMOA系统V1.02.13云点滴客户解决方案V1.0.0创想商务B2B网站管理系统V3.1冰兔(Btoo)网店系统V6.39ASP.NET4.0电子商城MVC+EF水果市场2......
  • 环保家具网站源码
    演示地址:www.m1.wuhaojie.cn 包含了网站首页;关于我们; 新闻动态;产品中心;案例展示;荣誉资质;招商加盟;联系我们;等多个版块,可以快速搭建家装设计品牌招商官网1.品牌展示:网站可以展示各种家具品牌的产品和服务,包括品牌介绍、产品展示、服务范围等,便于用户了解品牌的相......