如何通过示例在Java中使用CopyOnWriteArraySet
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,因此在迭代过程中不能保证元素的顺序。
- CopyOnWriteArraySet最适合于集大小通常保持较小的应用程序,只读操作大大超过了可变操作,并且您需要防止遍历期间线程之间的干扰。
- CopyOnWriteArraySet的另一个好处是线程安全,它是一个并发集合 。
- 可变操作(添加,设置,删除等)非常昂贵,因为它们通常需要复制整个基础数组。
- 迭代器不支持可变删除操作。
- 通过迭代器的遍历速度很快,并且不会遇到其他线程的干扰。 迭代器在构造迭代器时依赖于数组的不变快照。
这就是如何在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相关推荐
- exchanger_如何通过示例在Java中使用Exchanger
exchanger 大家好,如果您在并发Java应用程序中工作,那么您可能听说过java.util.concurrent包的Exchanger类. Java中的Exchanger是Java 1.5中与 ...
- 如何通过示例使用Java中的Exchanger
大家好,如果您在并发Java应用程序中工作,那么您可能听说过java.util.concurrent包的Exchanger类. Java中的Exchanger是Java 1.5中与CountDownL ...
- java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...
- 如何使用示例从Java中的类路径加载资源
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...
- 代码示例:Java中定义数组的三种方式
在Java中,数组的定义有三种方式,其基本语法格式如下: 数组类型[] 数组名 = new 数组类型[数组长度]; 数组类型[] 数组名 = new 数组类型[]{数组元素0,数组元素1,...}; ...
- Java i18n - Java中的国际化
Java i18n - Java中的国际化 Java或Java i18n的国际化是一个非常重要的特性.Java通过资源包提供国际化(i18n)支持. Java的国际化 为了使您的应用程序支持不同的语言 ...
- 【高并发】java中的CAS,你需要知道的东西
1.概述 转载:添加链接描述 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用java中的原子操作实现网 ...
- 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系
文章目录 1. 前言 java中的ssl语法与keytool 工具的联系 2. SSLContext的体系 2.1 KeyStore 2.1.1 通过证书库文件创建: 2.1.2 随机生成自签名证书库 ...
- 跳表在Java中的实现
跳表是一种数据结构,用于借助连接到元素子序列的链表层次结构来存储元素的排序列表.跳表允许以有效的方式处理项目查找.跳表是一种概率数据结构,这意味着它跳过整个列表中的几个元素,因此称为跳表.我们可以将跳 ...
最新文章
- Linux系统如何安装AutoFs挂载服务
- Nginx对某个文件夹或整个站点进行登录认证的方法
- java 读utf-8 xml_用Java和UTF-8編碼生成有效的XML。
- VMware虚拟机中CentOS根分区的扩展
- office word中利用宏编程批量调节图片的亮度和对比度
- 建站利器 | 阿里巴巴上线静态开源站点搭建工具 Docsite
- 1215课后练习----判断字符串位置
- bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整
- 小米8绑定账号和设备验证失败_网赚项目刚需账号答疑大集合!
- 软件分析与设计习题集
- 中国域名8大玩家传奇故事
- Intel CPU 微架构的演进与发展
- The server encountered an unexpected condition that prevented it from fulfilling the request
- 3D建模技巧:如果想用好ZBrush,必须知道这10点!
- 2019新版前端与移动开发学习路线图(视频+工具+书籍+资源)
- java开源运维平台_推荐一个:开源自动化运维开发平台(IT Automatic Develop Platform)...
- 查询计算机系统操作工,计算机系统操作工B卷
- Spirit - 腾讯移动 Web 整体解决方案
- Hbuilder-应用程序打包
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
热门文章
- java通过poi读取excel中的日期类型数据或自定义类型日期
- Linux程序之触摸,linux 触摸屏驱动编写
- java aop 实例_Spring aop 简单示例
- java登录界面命令_Java命令行界面(第25部分):JCommando
- javaserver_什么是JavaServer Faces(JSF)
- 工业互联网二级节点建设_建设者还是二传手?
- java ee api_Java EE安全性API向前发展
- [MEGA DEAL] Ultimate SQL Bootcamp认证捆绑包(98%)
- Hibernate事实:集成测试策略
- Spring State Machine:它是什么,您需要它吗?