博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JUC】JDK1.8源码分析之CopyOnWriteArraySet(七)
阅读量:4668 次
发布时间:2019-06-09

本文共 4054 字,大约阅读时间需要 13 分钟。

一、前言

  分析完了CopyOnWriteArrayList后,下面接着分析CopyOnWriteArraySet,CopyOnWriteArraySet与CopyOnWriteArrayList有莫大的联系,因为CopyOnWriteArraySet的底层是由CopyOnWriteArrayList提供支持,并且将对其的操作转发至对CopyOnWriteArrayList的操作。但是,CopyOnWriteArraySet的元素不允许重复,这是和CopyOnWriteArrayList不相同的地方,下面开始分析。

二、CopyOnWriteArraySet数据结构

  由于CopyOnWriteArraySet底层是使用CopyOnWriteArrayList,所以其数据结构与CopyOnWriteArrayList相同,采用数组结构。其结构如下

  说明:CopyOnWriteArraySet由于是基于CopyOnWriteArrayList的,所以对其操作都是基于CopyOnWriteArrayList的,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。

三、CopyOnWriteArraySet源码分析

  3.1 类的继承关系 

public class CopyOnWriteArraySet
extends AbstractSet
implements java.io.Serializable {}

  说明:CopyOnWriteArraySet继承了AbstractSet抽象类,AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作;同时实现了Serializable接口,表示可以序列化。

  3.2 类的属性  

public class CopyOnWriteArraySet
extends AbstractSet
implements java.io.Serializable { // 版本序列号 private static final long serialVersionUID = 5457747651344034263L; // 由其对CopyOnWriteArraySet提供支持 private final CopyOnWriteArrayList
al;}

  说明:其属性中包含了一个CopyOnWriteArrayList类型的变量al,对CopyOnWriteArraySet的操作会转发至al上执行。

  3.3 类的构造函数

  1. CopyOnWriteArraySet()型构造函数 

public CopyOnWriteArraySet() {        // 初始化al        al = new CopyOnWriteArrayList
(); }
View Code

  说明:此构造函数用于创建一个空 set。

  2. CopyOnWriteArraySet(Collection<? extends E>)型构造函数

public CopyOnWriteArraySet(Collection
c) { if (c.getClass() == CopyOnWriteArraySet.class) { // c集合为CopyOnWriteArraySet类型 // 初始化al @SuppressWarnings("unchecked") CopyOnWriteArraySet
cc = (CopyOnWriteArraySet
)c; al = new CopyOnWriteArrayList
(cc.al); } else { // c集合不为CopyOnWriteArraySet类型 // 初始化al al = new CopyOnWriteArrayList
(); // 添加c集合(c集合的元素在al中部存在时,才会添加) al.addAllAbsent(c); } }
View Code

  说明:此构造函数用于创建一个包含指定 collection 所有元素的 set。处理流程如下

  ① 判断集合c的类型是否为CopyOnWriteArraySet类型,若是,则获取c的al,并且初始当前CopyOnWriteArraySet的al域(调用CopyOnWriteArrayList的构造函数),否则,进入步骤②

  ② 新生CopyOnWriteArrayList,并赋值给al,之后调用addAllIfAbsent函数(al中不存在的元素,才添加)。

  3.4 核心函数分析

  由于对CopyOnWriteArraySet的操作(如add、remove、clear等)都转化为对CopyOnWriteArrayList的操作,所以在此不再进行讲解,有疑惑的读者可以参考的源码分析。

四、示例

  下面通过一个示例来了解CopyOnWriteArraySet的使用。  

package com.hust.grid.leesf.collections;import java.util.Iterator;import java.util.concurrent.CopyOnWriteArraySet;class PutThread extends Thread {    private CopyOnWriteArraySet
cowas; public PutThread(CopyOnWriteArraySet
cowas) { this.cowas = cowas; } public void run() { for (int i = 0; i < 10; i++) { cowas.add(i); } }}public class CopyOnWriteArraySetDemo { public static void main(String[] args) { CopyOnWriteArraySet
cowas = new CopyOnWriteArraySet
(); for (int i = 0; i < 10; i++) { cowas.add(i); } PutThread p1 = new PutThread(cowas); p1.start(); Iterator
iterator = cowas.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } System.out.println(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } iterator = cowas.iterator(); while (iterator.hasNext()) { System.out.print(iterator.next() + " "); } }}
View Code

  运行结果(某一次)  

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

  说明:首先,主线程向CopyWriteArraySet也添加了元素,然后,PutThread线程向CopyOnWriteArraySet中添加元素(与之前添加了元素重复),两次迭代,遍历集合,发现结果相同,即CopyWriteArraySet中没有重复的元素。

五、总结

  CopyOnWriteArraySet的源码比较简单,是依托CopyOnWriteArrayList而言,所以当分析完了CopyOnWriteArrayList后,CopyOnWriteArraySet的分析就非常简单,谢谢各位园友的观看~

  

转载于:https://www.cnblogs.com/leesf456/p/5549138.html

你可能感兴趣的文章
day 107radis非关系型数据库
查看>>
python re模块
查看>>
程序猿的爱情--2011-01-05
查看>>
loj#2073. 「JSOI2016」扭动的回文串
查看>>
finally代码块
查看>>
业务测试团队目标
查看>>
node事件发射器
查看>>
Silverlight中需要用到模板选择器(DataTemplateSelector)的替代方案
查看>>
Java线程池ExecutorService
查看>>
第三次作业
查看>>
项目应用EasyUI_Tab控件全部关闭
查看>>
CTF之信息泄漏
查看>>
JavaScript作用域
查看>>
瞎说一波3种基本背包问题【希望巨巨们指出错误】
查看>>
MySQL安装与操作总结
查看>>
python 中time, datetime的用法
查看>>
python中将函数赋值给变量时需要注意的一些问题
查看>>
SAS数据挖掘实战篇【五】
查看>>
如何成为合格的数据分析师
查看>>
ArcGIS10.5资源分享
查看>>