阅读JDK8 CopyOnWriteArraySet应该了解什么

风流意气都作罢 提交于 2020-04-09 20:25:16

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原数组,并在数组的末端添加。

未完待续

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!