大数据成神之路

大数据成神之路:

点我去成神之路系列目录^_^

预计更新500+篇文章,已经更新40+篇~

本系列的大纲会根据实际情况进行调整,欢迎大家关注~

导语

CopyOnWriteArraySet来啦,他有什么特性呢~ 往下看吧~

1概要

内容包括:

  • CopyOnWriteArraySet介绍
  • CopyOnWriteArraySet原理和数据结构
  • CopyOnWriteArraySet函数列表
  • CopyOnWriteArraySet源码
  • CopyOnWriteArraySet示例

2CopyOnWriteArraySet介绍

它是线程安全的无序的集合,可以将它理解成线程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类AbstractSet;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不是散列表。

和CopyOnWriteArrayList类似,CopyOnWriteArraySet具有以下特性:

  • 它最适合于具有以下特征的应用程序:Set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
  • 它是线程安全的。
  • 因为通常需要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销很大。
  • 迭代器支持hasNext(), next()等不可变操作,但不支持可变 remove()等 操作。
  • 使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。

建议:在学习CopyOnWriteArraySet之前,先对HashSet进行了解。

3CopyOnWriteArraySet原理和数据结构

CopyOnWriteArraySet的数据结构,如下图所示:

说明:

  • CopyOnWriteArraySet继承于AbstractSet,这就意味着它是一个集合。
  • CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的。而CopyOnWriteArrayList本质是个动态数组队列,所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合”! CopyOnWriteArrayList中允许有重复的元素;但是,CopyOnWriteArraySet是一个集合,所以它不能有重复集合。因此,CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个添加元素的API,通过这些API来添加元素时,只有当元素不存在时才执行添加操作!
  • 至于CopyOnWriteArraySet的"线程安全"机制,和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。这个在前一章节介绍CopyOnWriteArrayList时数据结构时,已经进行了说明,这里就不再重复叙述了。

4CopyOnWriteArraySet函数列表

// 创建一个空 set。CopyOnWriteArraySet()// 创建一个包含指定 collection 所有元素的 set。CopyOnWriteArraySet(Collection extends E> c)// 如果指定元素并不存在于此 set 中,则添加它。boolean add(E e)// 如果此 set 中没有指定 collection 中的所有元素,则将它们都添加到此 set 中。boolean addAll(Collection extends E> c)// 移除此 set 中的所有元素。void clear()// 如果此 set 包含指定元素,则返回 true。boolean contains(Object o)// 如果此 set 包含指定 collection 的所有元素,则返回 true。boolean containsAll(Collection> c)// 比较指定对象与此 set 的相等性。boolean equals(Object o)// 如果此 set 不包含任何元素,则返回 true。boolean isEmpty()// 返回按照元素添加顺序在此 set 中包含的元素上进行迭代的迭代器。Iterator iterator()// 如果指定元素存在于此 set 中,则将其移除。boolean remove(Object o)// 移除此 set 中包含在指定 collection 中的所有元素。boolean removeAll(Collection> c)// 仅保留此 set 中那些包含在指定 collection 中的元素。boolean retainAll(Collection> c)// 返回此 set 中的元素数目。int size()// 返回一个包含此 set 所有元素的数组。Object[] toArray()// 返回一个包含此 set 所有元素的数组;返回数组的运行时类型是指定数组的类型。 T[] toArray(T[] a)

5CopyOnWriteArraySet示例

CopyOnWriteArraySet是通过CopyOnWriteArrayList实现的,它的API基本上都是通过调用CopyOnWriteArrayList的API来实现的。相信对CopyOnWriteArrayList了解的话,对CopyOnWriteArraySet的了解是水到渠成的事。

下面,我们通过一个例子去对比HashSet和CopyOnWriteArraySet。

import java.util.*;import java.util.concurrent.*;/* * CopyOnWriteArraySet是“线程安全”的集合,而HashSet是非线程安全的。 * 下面是“多个线程同时操作并且遍历集合set”的示例 * (01) 当set是CopyOnWriteArraySet对象时,程序能正常运行。 * (02) 当set是HashSet对象时,程序会产生ConcurrentModificationException异常。 */public class CopyOnWriteArraySetTest1 { // TODO: set是HashSet对象时,程序会出错。 //private static Set set = new HashSet(); private static Set set = new CopyOnWriteArraySet(); public static void main(String[] args) { // 同时启动两个线程对set进行操作! new MyThread("ta").start(); new MyThread("tb").start(); } private static void printAll() { String value = null; Iterator iter = set.iterator(); while(iter.hasNext()) { value = (String)iter.next(); System.out.print(value+

cad的lisp程序大集合_大数据成神之路-Java高级特性增强(CopyOnWriteArraySet)相关推荐

  1. 大数据成神之路(持续更新)

    <2021年最新版大数据面试题全面开启更新> <2021年最新版大数据面试题全面开启更新> 已经在公众号更新文章目录: 大数据成神之路-Java高级特性增强 - 大数据成神之路 ...

  2. 「大数据成神之路」第三版更新完毕

    点击上方蓝色字体,选择"设为星标" 回复"面试"获取更多惊喜 <大数据成神之路>是我于2019年在Github发起的一个项目: Github地址:h ...

  3. 大数据成神之路你知道吧?

    给大家推荐一位来自一线大厂的大数据专家:王知无. 自从2019年开始,他就在Github开源了自己的<大数据成神之路>.收获6K+Star. 更是在公众号发布了180+篇原创文章.内容几乎 ...

  4. kafka offset保存在哪里_《Kafka成神之路》- 索引类型

    在Kafka的数据路径下有很多.index和.timeindex后缀文件: .index文件,即Kafka中的位移索引文件 .timeindex文件,即时间戳索引文件. 1 OffsetIndex - ...

  5. 我出书了,《逆天改命——程序员成神之路》开源,从业十年大厂技术专家的一百条人生建议,建议收藏

    大家好,我是启舰 我有本出版社约稿的书<逆天改命--程序员成神之路>,最终决定放弃出版社合作,开源给大家. 这本书集合了我从业十来年的经验结晶,希望能够帮到大家. 我在上学和工作期间,也总 ...

  6. java工程师知识架构图图_阿里技术专家教你画架构图、Java 工程师成神之路 | 2019 年 2 月收藏排行...

    五一假期,头条君会推送 2019 年 1-4 月 开发者头条 上收藏最多的文章 点击链接或图片 即可阅读 喜欢请 分享到朋友圈 哦 Java 工程师成神之路(2019 正式版) 结构调整,更适合从入门 ...

  7. Educoder–Java高级特性(第二章)- 集合框架【笔记+参考代码】

    Educoder–Java高级特性(第二章)- 集合框架[笔记+参考代码] 第一关 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,创建ArrayList集 ...

  8. lisp调用qleader端点_超经典【CAD】 lisp程序集锦、【CAD】快捷键大全(好).doc

    超经典CAD lisp程序集锦 如果您使用 AutoCAD,下面的内容对您一定有帮助.在某些方面能大大提高 您的工作效率.下面的程序均以源程序方式给出,您可以使用.参考.修改它. bg.lsp 表格自 ...

  9. 计算机视觉、机器学习相关领域论文和源代码大集合_拔剑-浆糊的传说_新浪博客...

    http://blog.csdn.net/zouxy09/article/details/8550952 顶] 计算机视觉.机器学习相关领域论文和源代码大集合--持续更新-- 计算机视觉.机器学习相关 ...

最新文章

  1. 【Ghost Blog】如何给Ghost Blog添加背景音乐
  2. ASP.NET编程中常用到的27个函数集
  3. DataX配置及使用
  4. 非静态方法可以访问Java中的静态变量/方法吗?
  5. ListView和RecycleView的性能比对
  6. 今日恐慌与贪婪指数为95 贪婪程度有所上升
  7. 关于go语言的测试相关内容笔记
  8. 删数问题(Noip1994)
  9. idean中jsp页面乱码_IntelliJ IDEA 控制台 乱码 有效解决办法
  10. VS+QT多语言实现(中文乱码问题、tr()包含不生成问题)
  11. Qt之如何识别小键盘(数字键盘)
  12. python中数字转英文_python:将数字转换成用英文表达的程序
  13. html的ul和li元素
  14. Vue3 中定义ts 对象
  15. 学python需要什么软件,python软件有哪些图标
  16. Android APP 启动时间测试
  17. 分布式对象和远程调用
  18. soso地图开放API info层详解
  19. 善用产业链招商,打造产业集群效应,实现产业协同发展
  20. 微信小商店快递单怎么一键打印;具体操作流程是什么?丨国仁猫哥

热门文章

  1. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的智慧养老管理系统
  2. 炒菜机器人放食材的顺序_2年要开1000家 碧桂园旗下千玺机器人餐厅开业
  3. 第一次冲刺团队绩效评估
  4. pc端实现 网页居中显示 且自适应
  5. XML文件解析之--DOM与SAX
  6. 试一下live writer 插入代码是否会高亮
  7. Leetcode: Excel Sheet Column Title
  8. [Delphi]ListView基本用法大全
  9. Qt signal slot 实现机制
  10. (篇二)C语言动态分配内存、计算π的值