高并发编程之CopyOnWriteArraySet讲解

一、CopyOnWriteArraySet介绍
它是线程安全的无序的集合,可以将它理解成线程安全的HashSet,有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类都继承于共同的父类;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不是散列表。和CopyOnWriteArrayList类似,CopyOnWriteArraySet具有以下特性:
1、它最适合于具有以下特征的应用程序:Set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
2、它是线程安全的。
3、因为通常需要复制整个基础数组,所以可变操作(add()、set() 和remove() 等等)的开销很大。
4、迭代器支持hasNext(), next()等不可变操作,但不支持可变remove()等操作。
5、使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。

二、CopyOnWriteArraySet的一些方法
1、add(E e) :如果指定元素并不存在于此 set 中,则添加它,返回值为Boolean。
2、clear():移除此 set 中的所有元素。
3、contains(Object o) : 如果此 set 包含指定元素,则返回 true。
4、equals(Object o) :比较指定对象与此 set 的相等性,返回值为 boolean 。
5、isEmpty() :如果此 set 不包含任何元素,则返回 true。
6、iterator() :返回按照元素添加顺序在此 set 中包含的元素上进行迭代的迭代器,返回值为 Iterator。
7、remove(Object o) :如果指定元素存在于此 set 中,则将其移除,返回值为 boolean 。
8、size() :返回此 set 中的元素数目。
9、Object[] toArray() : 返回一个包含此 set 所有元素的数组。

三、Java代码示例

package chapter3.copyonwrite;

import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author czd
 */
public class CopyOnWriteArraySetTest {
    public static void main(String[] args) {
        /**
         * CopyOnWriteArraySet():
         *           创建一个空 set。
         * CopyOnWriteArraySet(Collection<? extends E> c):
         *           创建一个包含指定 collection 所有元素的 set。
         */

        /**
         * 1、add(E e):如果指定元素并不存在于此 set 中,则添加它,返回值为Boolean
         */
        CopyOnWriteArraySet<Integer> copyOnWriteArraySet = new CopyOnWriteArraySet<>();
        Boolean addBoolean = copyOnWriteArraySet.add(1);
        System.out.println("是否添加成功?" + addBoolean);

        /**
         *  2、contains(Object o) :如果此 set 包含指定元素,则返回 true
         */
        Boolean containsBoolean = copyOnWriteArraySet.contains(1);
        System.out.println("CopyOnWriteArraySet中是否存在1?" + containsBoolean);

        /**
         * 3、isEmpty() :如果此 set 不包含任何元素,则返回 true。
         */
        Boolean isEmptyBoolean = copyOnWriteArraySet.isEmpty();
        System.out.println("copyOnWriteArraySet是否为空?" + isEmptyBoolean);

        /**
         * 4、iterator():返回按照元素添加顺序在此 set 中包含的元素上进行迭代的迭代器,Iterator<E>。
         */
        copyOnWriteArraySet.add(2);
        copyOnWriteArraySet.add(3);
        copyOnWriteArraySet.add(4);
        copyOnWriteArraySet.add(5);

        Iterator<Integer> iterator = copyOnWriteArraySet.iterator();
        while (iterator.hasNext()){
            System.out.println("Iterator的结果: " + iterator.next());
        }

        /**
         * 5、remove(Object o) :如果指定元素存在于此 set 中,则将其移除,返回值为Boolean。
         */
        Boolean removeBoolean = copyOnWriteArraySet.remove(5);
        System.out.println("是否移除5成功?" + removeBoolean);

        /**
         * 6、size() :返回此 set 中的元素数目。
         */
        CopyOnWriteArraySet<Integer> copyOnWriteArraySet1 = new CopyOnWriteArraySet<>();
        copyOnWriteArraySet1.add(1);
        copyOnWriteArraySet1.add(2);
        copyOnWriteArraySet1.add(3);
        copyOnWriteArraySet1.add(1);
        copyOnWriteArraySet1.add(3);
        Integer size = copyOnWriteArraySet1.size();
        System.out.println("copyOnWriteArraySet1的size: " + size);
    }
}

四、CopyOnWriteArraySet其他特性介绍

1、CopyOnWriteArraySet的结构严格意义来说是一个集合,它的底层实现是利用数组,它的上层实现是CopyOnWriteArrayList。
2、CopyOnWriteArraySet是一个集合,所以它是不可以放置重复的元素的,它的取重逻辑是在add中体现的。
3、CopyOnWriteArraySet是利用CopyOnWriteArrayList来实现的,因为CopyOnWriteArrayList是线程安全的,所以CopyOnWriteArraySet操作也是线程安全的。

  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java并发线程安全集合是指在多线程环境下能够保证数据一致性和线程安全的数据结构。Java提供了许多并发线程安全集合,包括ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSetCopyOnWriteArrayList、CopyOnWriteArraySet等。 ConcurrentHashMap是一个线程安全的哈希表,它允许多个线程同时读取并修改其中的元素。它使用分段锁的方式来实现并发访问,不同的线程可以同时访问不同的分段,从而提了并发性能。 ConcurrentSkipListMap是一个基于跳表的并发有序映射,它可以提供较好的并发性能,且支持按照键的顺序进行遍历。它的实现是通过通过多层链表实现的,每一层链表中的节点按照键的顺序排列。 ConcurrentSkipListSet是一个基于ConcurrentSkipListMap的并发有序集合,它实现了Set接口,并且保证元素的有序性和线程安全性。 CopyOnWriteArrayList是一个线程安全的ArrayList,它通过每次修改时创建一个新的副本来实现线程安全。虽然在插入和删除操作时需要复制整个数组,但读取操作非常效,适用于读操作远多于写操作的场景。 CopyOnWriteArraySet是一个线程安全的Set,它是基于CopyOnWriteArrayList实现的。它通过复制整个数组来实现线程安全,保证了元素的唯一性和线程安全。 这些并发线程安全集合在多线程环境中保证了数据的一致性和线程安全性,能够提并发性能和效率,适用于度并发和需要频繁读写的场景。但需要注意的是,并发集合在某些操作上可能会损失一些性能,因此在选择使用时需根据具体需求进行权衡和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值