CopyOnWriteArraySet是CopyOnWriteArrayList类的弟弟。 这些是专用集合类,这些类是在JDK 1.5上添加的,以及它们最流行的表亲ConcurrentHashMap 。 它们是并发收集框架的一部分,位于java.util.concurrent包中。
CopyOnWriteArraySet最适合作为只读集合,其大小足够小,以便在发生某些变异操作时进行复制,例如,您可以在应用程序启动时使用CopyOnWriteArraySet来存储对象,并允许多个应用程序线程在应用程序生命周期中对其进行访问。 如果在此期间出现了新的条件或对象,也可以将其添加到此Set中,但会产生创建新数组的费用。 关于CopyOnWriteArraySet要了解的最重要的事情之一是它由CopyOnWriteArrayList支持,这意味着它还共享CopyOnWriteArrayList的所有基本属性。 要记住的另一件事是该集合类的迭代器不支持remove()操作,尝试在迭代时删除一个元素将导致UnSupportedOperationException。 这样做是为了确保遍历期间的速度,使用Iterator遍历此set实现的速度很快,并且不会遇到其他线程的干扰。 迭代器实际上在构造迭代器时依赖于不变的阵列快照。 简而言之,如果set足够小,可以在添加,设置或删除时进行复制,则使用CopyOnWriteArraySet,并且主要目的是读取偶尔更新的数据。 另外,如果要在迭代过程中删除元素,请不要使用此Set实现,因为它的迭代器不支持remove(),并抛出java.lang.UnsupportedOperationException,如下所示:

[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)at Publisher.notifySubs(HelloHP.java:43)at HelloHP.main(HelloHP.java:23)

这是我们完整的Java程序,展示了如何使用CopyOnWriteArraySet 。 在我们的示例中,我们使用发布者订阅者模式来演示其用法。 在启动过程中订阅的大多数订户,发布者的主要任务是对其进行迭代,并通知他们任何更新。 有时也可以添加和删除订户。 由于我们需要快速遍历,因此CopyOnWriteArraySet是一个不错的选择,尤其是在多线程环境中,其中一个线程可以添加订户,而另一个线程正在处理更新。

import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;/*** Java program to demonstrate how to use CopyOnWriteArraySet in Java. Remember,* CopyOnWriteArraySet doesn't support remove() operation.** @author Javin Paul*/
public class CopyOnWriteArraySetDemo{public static void main(String args[]) {Publisher cricNext = new Publisher();SubScriber raj = new SubScriber("RAJ");SubScriber adom = new SubScriber("ADOM");cricNext.addSubscriber(raj);cricNext.addSubscriber(adom);cricNext.notifySubs("FOUR");cricNext.notifySubs("SIX");}}class Publisher {private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();public void addSubscriber(SubScriber sub) {setOfSubs.add(sub);}public void notifySubs(String score) {Iterator itr = setOfSubs.iterator();while (itr.hasNext()) {SubScriber sub = itr.next();sub.receive(score);//itr.remove(); // not allowed, throws UnsupportedOperationException}}
}class SubScriber {private String _name;public SubScriber(String name) {this._name = name;}public void receive(String score) {System.out.printf("[%s] Event received : %s %n", _name, score);}
}Output:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX

CopyOnWriteArraySet实现Collection和Set接口,并在JDK 1.5上与另一个特殊的Set实现EnumSet一起添加。 这也是一个使用内部CopyOnWriteArrayList进行所有操作的Set。 因此,它具有该类的相同基本属性。 它不是SortedSet,因此在迭代过程中不能保证元素的顺序。

  1. CopyOnWriteArraySet最适合于集大小通常保持较小的应用程序,只读操作大大超过了可变操作,并且您需要防止遍历期间线程之间的干扰。
  2. CopyOnWriteArraySet的另一个好处是线程安全,它是一个并发集合 。
  3. 可变操作(添加,设置,删除等)非常昂贵,因为它们通常需要复制整个基础数组。
  4. 迭代器不支持可变删除操作。
  5. 通过迭代器的遍历速度很快,并且不会遇到其他线程的干扰。 迭代器在构造迭代器时依赖于数组的不变快照。

这就是如何在Java中使用CopyOnWriteArraySet的全部内容。 正如我所说的,它是CopyOnWriteArrayList的弟弟,因此,如果您了解其中之一,则可以使用其他方法。 两者唯一的区别是一个是List,另一个是Set,但这带来了Java中Set和List之间的所有区别 。 例如,列表是有序的,而Set是无序的则允许重复,但不允许重复。 始终记住,CopyOnWriteArraySet是一个特殊用途的Collection类,并且仅应在条件允许的情况下使用它,否则请坚持使用通用Set实施,例如HashSet,LinkedHashSet或同步的收集类。

翻译自: https://www.javacodegeeks.com/2014/06/how-to-use-copyonwritearrayset-in-java-with-example.html

如何通过示例在Java中使用CopyOnWriteArraySet相关推荐

  1. exchanger_如何通过示例在Java中使用Exchanger

    exchanger 大家好,如果您在并发Java应用程序中工作,那么您可能听说过java.util.concurrent包的Exchanger类. Java中的Exchanger是Java 1.5中与 ...

  2. 如何通过示例使用Java中的Exchanger

    大家好,如果您在并发Java应用程序中工作,那么您可能听说过java.util.concurrent包的Exchanger类. Java中的Exchanger是Java 1.5中与CountDownL ...

  3. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

  4. 如何使用示例从Java中的类路径加载资源

    Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...

  5. 代码示例:Java中定义数组的三种方式

    在Java中,数组的定义有三种方式,其基本语法格式如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 数组类型[] 数组名 = new 数组类型[]{数组元素0,数组元素1,...}; ...

  6. Java i18n - Java中的国际化

    Java i18n - Java中的国际化 Java或Java i18n的国际化是一个非常重要的特性.Java通过资源包提供国际化(i18n)支持. Java的国际化 为了使您的应用程序支持不同的语言 ...

  7. 【高并发】java中的CAS,你需要知道的东西

    1.概述 转载:添加链接描述 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用java中的原子操作实现网 ...

  8. 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系

    文章目录 1. 前言 java中的ssl语法与keytool 工具的联系 2. SSLContext的体系 2.1 KeyStore 2.1.1 通过证书库文件创建: 2.1.2 随机生成自签名证书库 ...

  9. 跳表在Java中的实现

    跳表是一种数据结构,用于借助连接到元素子序列的链表层次结构来存储元素的排序列表.跳表允许以有效的方式处理项目查找.跳表是一种概率数据结构,这意味着它跳过整个列表中的几个元素,因此称为跳表.我们可以将跳 ...

最新文章

  1. Linux系统如何安装AutoFs挂载服务
  2. Nginx对某个文件夹或整个站点进行登录认证的方法
  3. java 读utf-8 xml_用Java和UTF-8編碼生成有效的XML。
  4. VMware虚拟机中CentOS根分区的扩展
  5. office word中利用宏编程批量调节图片的亮度和对比度
  6. 建站利器 | 阿里巴巴上线静态开源站点搭建工具 Docsite
  7. 1215课后练习----判断字符串位置
  8. bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整
  9. 小米8绑定账号和设备验证失败_网赚项目刚需账号答疑大集合!
  10. 软件分析与设计习题集
  11. 中国域名8大玩家传奇故事
  12. Intel CPU 微架构的演进与发展
  13. The server encountered an unexpected condition that prevented it from fulfilling the request
  14. 3D建模技巧:如果想用好ZBrush,必须知道这10点!
  15. 2019新版前端与移动开发学习路线图(视频+工具+书籍+资源)
  16. java开源运维平台_推荐一个:开源自动化运维开发平台(IT Automatic Develop Platform)...
  17. 查询计算机系统操作工,计算机系统操作工B卷
  18. Spirit - 腾讯移动 Web 整体解决方案
  19. Hbuilder-应用程序打包
  20. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)

热门文章

  1. java通过poi读取excel中的日期类型数据或自定义类型日期
  2. Linux程序之触摸,linux 触摸屏驱动编写
  3. java aop 实例_Spring aop 简单示例
  4. java登录界面命令_Java命令行界面(第25部分):JCommando
  5. javaserver_什么是JavaServer Faces(JSF)
  6. 工业互联网二级节点建设_建设者还是二传手?
  7. java ee api_Java EE安全性API向前发展
  8. [MEGA DEAL] Ultimate SQL Bootcamp认证捆绑包(98%)
  9. Hibernate事实:集成测试策略
  10. Spring State Machine:它是什么,您需要它吗?