博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阅读JDK8 CopyOnWriteArraySet应该了解什么
阅读量:6157 次
发布时间:2019-06-21

本文共 863 字,大约阅读时间需要 2 分钟。

hot3.png

1、为什么说该集合是线程安全

final transient ReentrantLock lock = new ReentrantLock();
private transient volatile Object[] array;
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();    }}

该集合中add,set通过ReentrantLock实现同步,volatile定义的变量在线程间可见的。

2、为什么不适用synchronized

synchronized和ReentrantLock的作用是相同的,但ReentrantLock提供更丰富的特性,比如:定时锁等待,可中断锁,锁投票等,性能更优一些。ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。

3、CopyOnWriteArraySet是由Object[]实现,当执行add方法时,会重新copy原数组,并在数组的末端添加。

未完待续

转载于:https://my.oschina.net/huangchp/blog/1553546

你可能感兴趣的文章
ubuntu set defult jdk
查看>>
[译]ECMAScript.next:TC39 2012年9月会议总结
查看>>
【Xcode】编辑与调试
查看>>
用tar和split将文件分包压缩
查看>>
[BTS] Could not find stored procedure 'mp_sap_check_tid'
查看>>
PLSQL DBMS_DDL.ALTER_COMPILE
查看>>
Activity生命周期
查看>>
高仿UC浏览器弹出菜单效果
查看>>
Ubuntu忘记密码,进不了系统的解决方法
查看>>
[原创]白盒测试技术思维导图
查看>>
<<Information Store and Management>> 读书笔记 之八
查看>>
Windows 8 开发之设置合约
查看>>
闲说HeartBeat心跳包和TCP协议的KeepAlive机制
查看>>
MoSQL
查看>>
Hibernate多对一外键单向关联(Annotation配置)
查看>>
《CLR via C#》读书笔记 之 方法
查看>>
设计模式:组合模式(Composite Pattern)
查看>>
ContentValues 和HashTable区别
查看>>
LogicalDOC 6.6.2 发布,文档管理系统
查看>>
给PowerShell脚本传递参数
查看>>