2026/4/18 12:37:56
网站建设
项目流程
wordpress 淘宝客网站模板,伊犁北京网站建设,百度推广方式,网页设计与制作txtCOW类并发容器
COW类并发容器#xff0c;全称#xff1a;Copy On Write容器#xff0c;写时复制容器。#xff08;读写分离容器#xff09;
原理#xff1a;
向容器中添加元素时#xff0c;先将容器进行复制#xff0c;复制出一个新容器#xff0c;然后将元素添加到…COW类并发容器COW类并发容器全称Copy On Write容器写时复制容器。读写分离容器原理向容器中添加元素时先将容器进行复制复制出一个新容器然后将元素添加到新容器中再将原容器的引用指向新容器。并发读的时候不需要锁定容器因为原容器没有变化所以可以读取原容器中的值使用的是一种读写分离的思想。注意CopyOnWrite容器只能保证数据的最终一致性不能保证数据实时一致性。所以如果你希望写入的的数据马上能读到请不要使用CopyOnWrite容器。CopyOnWriteArrayList源码分析publicclassCopyOnWriteArrayListE{//底层基于数组实现的privatetransientvolatileObject[]array;publicCopyOnWriteArrayList(){setArray(newObject[0]);}finalvoidsetArray(Object[]a){arraya;// array new Object[0]}//add方法publicbooleanadd(Ee){finalReentrantLocklockthis.lock;lock.lock();try{//返回底层array数组,给了elementsObject[]elementsgetArray();//获取elements的长度---》获取老数组的长度intlenelements.length;//完成数组的复制将老数组中的元素复制到新数组中并且新数组的长度加1操作Object[]newElementsArrays.copyOf(elements,len1);//将e元素放入新数组最后位置newElements[len]e;//array数组的指向从老数组变为新数组setArray(newElements);returntrue;}finally{lock.unlock();}}finalObject[]getArray(){returnarray;//返回底层数组}privatebooleanaddIfAbsent(Ee,Object[]snapshot){finalReentrantLocklockthis.lock;lock.lock();try{//取出array数组给currentObject[]currentgetArray();intlencurrent.length;if(snapshot!current){// Optimize for lost race to another addXXX operationintcommonMath.min(snapshot.length,len);//遍历老数组for(inti0;icommon;i)//eq(e, current[i])将放入的元素和老数组的每一个元素进行比较如果有重复的元素就返回false不添加了if(current[i]!snapshot[i]eq(e,current[i]))returnfalse;if(indexOf(e,current,common,len)0)returnfalse;}//完成数组的复制将老数组中的元素复制到新数组中并且新数组的长度加1操作Object[]newElementsArrays.copyOf(current,len1);//将e元素放入新数组最后位置newElements[len]e;//array数组的指向从老数组变为新数组setArray(newElements);returntrue;}finally{lock.unlock();}}}