如何通过示例在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,因此在迭代过程中不能保证元素的顺序。

Java中的CopyOnWriteArraySet示例

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成器

一、什么是生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素&#…

VS2008快捷键大全

CtrlmCrtro折叠所有大纲CtrlMCrtrP: 停止大纲显示CtrlKCrtrC: 注释选定内容CtrlKCrtrU: 取消选定注释内容CtrlJ : 列出成员 智能感知ShiftAltEnter: 切换全屏编辑CtrlB,T / CtrlK,K: 切换书签开关CtrlB,N / CtrlK,N: 移动到下一书签 CtrlB,P: 移动到上一书签 CtrlB,C: 清除全部…

jQuery 入口函数主要有4种写法

jqery 入口函数主要有4种写法&#xff0c;其中以第3种方法最为方便。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

面向对象的三大特征 封装继承多态

面向对象设计 和开发程序的好处 交流更加流畅 、提高设计和开发效率 封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问私有化属性 提供公有化的访问方法 保证数据的安全性封装的步骤 …

Spring / Hibernate应用程序的性能调优

对于大多数典型的Spring / Hibernate企业应用程序&#xff0c;应用程序性能几乎完全取决于其持久层的性能。 这篇文章将讨论如何确认我们是否存在“数据库绑定”应用程序&#xff0c;然后逐步讲解7个经常使用的“快速取胜”技巧&#xff0c;这些技巧可以帮助提高应用程序性能。…

我的学习开发环境,呵呵!

今天到电子市场去&#xff0c;花了近700块&#xff0c;弄了块ARM的学习单板&#xff0c;再也不用去搞什么虚拟机了&#xff01; 简单的看了一下开发手册&#xff0c;还有点麻烦&#xff0c;可能得花点时间去把它搞清楚&#xff01; 但这块单板的功能还是很强的&#xff0c;基本…

Java on Windows Mobile

Moved to http://blog.tangcs.com/2008/05/29/java-on-windows-mobile/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/05/29/1209726.html

Jsの练习-数组常用方法

1. join() 方法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

新手学习笔记Spring AOP全自动编程

业务类 package oyb.service;public interface IUserService {public void add();public void delete(); } package oyb.service;public class UserServiceImpl implements IUserService {Overridepublic void add() {System.out.println("添加用户。。。。");}Overr…

Gradle入门:我们的第一个Java项目

这篇博客文章描述了如何使用Gradle编译和打包一个简单的Java项目。 我们的Java项目只有一个要求&#xff1a; 我们的构建脚本必须创建一个可执行的jar文件。 换句话说&#xff0c;我们必须能够使用以下命令运行程序&#xff1a; java -jar jarfile.jar让我们找出如何满足这一…

特征码弊端渐显 杀毒技术面临革命

一种观点认为&#xff0c;防病毒与安全供应商们在与网络罪犯们的战斗中正逐步失去主动。黑客们的网络爬虫正越来越多的偷偷潜入计算机&#xff0c;植入恶意程序&#xff0c;打开计算机发送远程攻击指令&#xff0c;并把它们变为僵尸网络的僵尸军团。 造成这个局面的根本原因在于…

《金字塔原理》读书笔记

第一篇 表达的逻辑 1.金字塔原理序文 人们希望达到的境界&#xff1a;想清楚、说明白、知道说什么、怎么说。 需要清楚3件事情&#xff1a; 谁是我的听众&#xff1f; 他们想听什么&#xff1f; 他们想怎么样听&#xff1f; 金字塔的基本原理 金字塔原理是一种重点突出、逻…

9 个鲜为人知的 Python 数据科学库

除了 pandas、scikit-learn 和 matplotlib&#xff0c;还要学习一些用 Python 进行数据科学的新技巧。Python 是一种令人惊叹的语言。事实上&#xff0c;它是世界上增长最快的编程语言之一。它一次又一次地证明了它在各个行业的开发者和数据科学者中的作用。Python 及其库的整个…

列出和过滤NIO.2中的目录内容

在Java 7发行之前&#xff0c;列出目录内容的领域并没有发生太多的事情。但是&#xff0c;由于NIO.2引入了一种新的方式来做到这一点&#xff0c;因此涵盖这一领域可能是值得的。 NIO.2的一大优点是能够在一个方法调用中立即使用列表和过滤。 这为与文件系统相关的大多数列表/筛…

Windows Mobile 编程 (Win32) - 获取设备能力

《Windows 程序设计》第五章重点讲述图形基础。首先一个示例代码是获取设备描述表信息。代码与Windows Mobile 编程 (Win32) - 输出文本中的代码类似。 #include <windows.h>#define NUMLINES ((int)(sizeof devcaps / sizeof devcaps[0]))struct {int iIndex;TCHAR …

Netty : writeAndFlush的线程安全及并发问题

使用Netty编程时&#xff0c;我们经常会从用户线程&#xff0c;而不是Netty线程池发起write操作&#xff0c;因为我们不能在netty的事件回调中做大量耗时操作。那么问题来了 – 1&#xff0c; writeAndFlush是线程安全的吗&#xff1f; 2&#xff0c; 是否使用了锁&#xff0c;…

[翻译-ASP.NET MVC]Contact Manager开发之旅

本翻译系列为asp.net mvc官方实例教程。在这个系列中&#xff0c;Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试、TDD、Ajax、软件设计原则及设计模式创建一个完整的Contact Manager应用。本系列共七个章节&#xff0c;也是七次迭代过程。本人将陆续对其进行…

数据库 日期格式操作

sql server: 日期转字符串-日期select CONVERT(varchar(100), GETDATE(), 23) from RegionRealtimeData 日期转字符串-全select CONVERT(varchar(100), GETDATE(), 20) from RegionRealtimeData 字符串转日期-日期select CONVERT(date, 2016-02-11, 23) from RegionRealtimeDat…

jsp输出所有请求头的名称

Enumeration headernamesrequest.getHeaderNames();while(headernames.hasMoreElements()){String headernameheadernames.nextElement();out.println(headername "-->" request.getHeader(headername) "");}out.println("");更多专业前端知识…

Spring4:具有Java 8 Date-Time API的@DateTimeFormat

在Spring 3.0中作为Formatter SPI的一部分引入的DateTimeFormat批注可用于解析和打印Web应用程序中的本地化字段值。 在Spring 4.0中&#xff0c; DateTimeFormat批注可以直接与Java 8 Date-Time API&#xff08; java.time &#xff09;一起使用。 在Spring中&#xff0c;可以…