如何通过示例在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万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素&#…

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

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

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

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

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

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

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…

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

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

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;可以…

JSF中run项目时候Tomcat8启动不了的一种方法

把另一个博客内容迁移到这 我的问题是Tomcat是可以启动的 但是run那个jsp的时候七月 10, 2016 3:14:54 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property source to org.eclipse…

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index.

elasticsearch_dsl.exceptions.ValidationException: You cannot write to a wildcard index. 这里是因为版本不匹配的问题 查看es版本方法如下&#xff1a; 查看elasticsearch包与elasticsearch-dsl版本方法&#xff08;pip list&#xff09;如下&#xff1a; 因为我的es是5.1…

在Java中对Singleton类进行双重检查锁定

Singleton类在Java开发人员中非常常见&#xff0c;但是它给初级开发人员带来了许多挑战。 他们面临的主要挑战之一是如何使Singleton保持为Singleton&#xff1f; 也就是说&#xff0c;无论出于何种原因&#xff0c;如何防止单个实例的多个实例。 对Singleton进行双重检查锁定是…

wstngfw中使用Viscosity连接OpenV-P-N服务器

wstngfw中使用Viscosity连接OpenV-P-N服务器 在本例中&#xff0c;将假设以下设置&#xff1a; 站点 A站点 B名称Beijing Office&#xff08;北京办公室&#xff09;名称Shenzheng Office&#xff08;深圳办公室&#xff09;WAN IP192.168.10.46WAN IP192.168.20.46LAN 子网192…

开张了!

今天开张了&#xff0c;试试看&#xff01; Code1using System; 2using System.Collections.Generic; 3using System.Text; 4 5namespace Model 6{ 7 public enum SiteType 8 { System,External,All}; 9 [Serializable]10 class SiteInfo11 {12 public i…

dubbo和zookeeper的关系

转载前言&#xff1a;网络上很多教程没有描述zookeeper和dubbo到底是什么关系、分别扮演了什么角色等信息&#xff0c;都是说一些似是而非的话&#xff0c;这里终于找到一篇文章&#xff0c;比较生动地描述了注册中心和微服务框架之间的关系&#xff0c;以及他们之间的合作分工…

Flink学习(二)Flink中的时间

摘自Apache Flink官网 最早的streaming 架构是storm的lambda架构 分为三个layer batch layerserving layerspeed layer一、在streaming中Flink支持的通知时间 Flink官网写了个了解streaming和各种时间的博客 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-1…

RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

在这篇文章中&#xff0c;我将展示一些创建Spring Web应用程序的准则&#xff0c;使用Jetty以及使用名为ROME的外部库运行RSS来运行它。 一般 我最近创建了一个示例Web应用程序&#xff0c;充当RSS阅读器。 我想检查ROME以阅读RSS。 我还想使用Spring容器和MVC创建最简单的视图…

HZOJ string

正解炸了…… 考试的时候想到了正解&#xff0c;非常高兴的打出来了线段树&#xff0c;又调了好长时间&#xff0c;对拍了一下发现除了非常大的点跑的有点慢外其他还行。因为复杂度算着有点高…… 最后正解死于常数太大……旁边的lyl用同样的算法拿了90分我却拿了个暴力的分40……

Unity3D入门其实很简单

在上次发布拙作后&#xff0c;有不少童鞋询问本人如何学习Unity3D。本人自知作为一名刚入门的菜鸟&#xff0c;实在没有资格谈论这么高大上的话题&#xff0c;生怕误导了各位。不过思来想去&#xff0c;决定还是写一些自己的经验&#xff0c;如果能给想要入门U3D的您一些启发&a…

4. HTML表单标签

表单是网页中最常见的元素&#xff0c;也是用户和我们交互的重要手段&#xff0c;在网站中的登录、注册、信息更新这些功能都是依赖表单实现的。在HTML中对于表单提供了一系列的标签&#xff0c;即输入框、下拉框、按钮、文本域&#xff0c;如下是一个最常见的表单结构内容&…

为Lucene选择快速唯一标识符(UUID)

大多数使用Apache Lucene的搜索应用程序都会为每个索引文档分配唯一的ID&#xff08;即主键&#xff09;。 尽管Lucene本身不需要这样做&#xff08;它可能不太在乎&#xff01;&#xff09;&#xff0c;但应用程序通常需要它以后通过其外部ID替换&#xff0c;删除或检索该文档…