首页 > 编程知识 正文

list集合转jsonarray,copyonwritearrayset

时间:2023-05-03 13:36:56 阅读:165143 作者:321

CopyOnWriteArrayList概述CopyOnWrite机制也称为写入时复制。

publicclasscopyonwritearraylisteimplementsliste、RandomAccess、Cloneable、java.io.Serializable {}在许多APP场景中,读取读取操作不会更改原始数据,因此每次读取时执行锁定操作会浪费资源。 必须允许多个线程同时访问List的内部数据。 说起来,读取操作是线程安全的。

这与ReentrantReadWriteLock的读写锁定思想非常相似。 即读写共享、写入互斥、读写互斥和写入互斥。 JDK中备有CopyOnWriteArrayList类,比读写锁中的思想更进一步,可以说是读写锁规则的进化。 为了最大限度地发挥读取的性能,CopyOnWriteArrayList读取可以不施加任何锁定,更厉害的是不会因写入而阻塞读取动作,只在写入和写入之间需要同步等待,从而读出

CopyOnWriteArrayList原理分析

CopyOnWriteArrayList类的所有可变操作(add、set等)都是通过创建基础数组的新副本来实现的。 如果需要修改List,请复制原始数据一次,并将修改后的内容写入副本,而不是直接修改原始数组对象。 完成后,可以通过将修改后的副本替换为原始数据来确保写入操作不影响读取操作。

从CopyOnWriteArrayList的名字可以看出,CopyOnWriteArrayList是满足CopyOnWrite的ArrayList,CopyOnWrite是指对一个内存进行修改时,http://www .

CopyOnWriteArrayList源代码读取和写入分析实现CopyOnWriteArrayList读取操作:读取操作没有同步控制和锁定操作。 原因是内部数组array不会更改,只是由另一个数组替换,从而保证数据的安全。 /** The array,accessedonlyviagetarray/setarray.*/privatetransientvolatileobject [ ] array; 公共代理(intindex return getarray )、索引(index ); }@suppresswarnings(unchecked ) (privateeget ) object ) a,int index ) ) return ) e ) a ) index ); } final Object[] getArray () { return array; }实现CopyOnWriteArrayList写入操作: CopyOnWriteArrayList写入操作add )方法在添加集合时锁定,避免多线程写入时copy出现多个副本/* * * appendsthespecifiedelementtotheendofthislist.* * @ paramelementtobeappendedtothislist * @ return { @ code true } (asassed ) lock.lock (; //锁定try { Object[] elements=getArray (; int len=elements.length; object [ ] new elements=arrays.copy of (elements,len 1); //新数组newElements[len]=e; setarray (新元素; 返回真; } finally { lock.unlock (); //解锁} }应用场景不直接在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后,再将原来指向的内存指针指到新的内存,原来的内存就可以被回收。

在许多APP应用场景中,读取可能比写入多得多。 例如,系统级信息中的一些信息很少被加载或修改,但经常被系统中的所有模块访问。 在这种情况下,我们最想看到的是能够尽快进行读取操作。 写晚了也没关系。

读操作可以尽可能的快,而写即使慢一些也没关系:

黑名单是最典型的情况,如果有搜索网站,用户会在该网站的搜索框中输入关键字搜索内容,但有些关键字无法搜索。 这些无法搜索的关键字将被列入黑名单。 黑名单不需要实时更新,也许每晚更新就可以了。 用户搜索时,会检查当前关键字是否不在黑名单中,如果存在,则表示无法搜索。 这种读写较少的场景也适合使用CopyOnWrite集合。

缺点这些缺点不仅适用于CopyOnWriteArrayList,实际上也适用于其他CopyOnWrite容器:

1 .内存使用问题:

由于CopyOnWrite的写入时复制机制,写入操作会同时在内存中驻留两个对象的内存,相应地会消耗额外的内存空间。 当元素较多或复杂时,复制开销较大,复制过程不仅消耗两倍的内存,还需要消耗CPU等资源,从而降低整体性能。 2 .数据完整性问题

由于对CopyOnWrite容器的修改会先修改副本,因此其他线程不会实时看到此修改,并且只有在修改完成后才会生效。 如果希望其他线程立即看到写入的数据,则无法应用CopyOnWrite容器。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。