java.util.concurrent;

简介

  1. CopyOnWriteArrayList是一个线程安全的ArrayList,通过内部的volatile数组显式锁ReentrantLock来实现线程安全。
  2. CopyOnWriteArraySet是线程安全的Set,它是由CopyOnWriteArrayList实现,内部持有一个CopyOnWriteArrayList引用,所有的操作都是由 CopyOnWriteArrayList来实现的,区别就是CopyOnWriteArraySet是无序的,并且不允许存放重复值。

CopyOnWrite适用场景

  1. 适合元素比较少,并且读取操作高于更新(add/set/remove)操作的场景
  2. 由于每次更新需要复制内部数组,所以更新操作开销比较大
  3. 内部的迭代器 iterator 使用了“快照”技术,存储了内部数组快照, 所以它的 iterator 不支持remove、set、add操作,但是通过迭代器进行并发读取时效率很高。

CopyOnWriteArrayList源码(并发安全解决方案一)

    /**
* The lock protecting all mutators. (We have a mild preference
* for builtin monitors over ReentrantLock when either will do.)
*/
final transient Object lock = new Object(); /** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array; /**
* Appends the specified element to the end of this list.
*/
public boolean add(E e) {
synchronized (lock) {
Object[] es = getArray();
int len = es.length;
es = Arrays.copyOf(es, len + 1);
es[len] = e;
setArray(es);
return true;
}
} public E get(int index) {
return elementAt(getArray(), index);
}

ArrayList并发安全解决方案二

List<String> list = Collections.synchronizedList(new ArrayList<String>());

CopyOnWriteArraySet

线程安全的无序的集合,可以将它理解成线程安全的HashSet

CopyOnWriteArraySet(底层实现是利用数组,上层实现是CopyOnWriteArrayList),但不能有重复元素:
CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个添加元素的API,只有当元素不存在时才执行添加操作! CopyOnWriteArraySet的“线程安全”机制,和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的

JUC 一 CopyOnWriteArrayList 和 CopyOnWriteArraySet的更多相关文章

  1. Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

    概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...

  2. 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet

    CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别.因此这里就先 ...

  3. CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的实现原理和适用场景

    ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的 ...

  4. java数据结构之CopyOnWriteArrayList和CopyOnWriteArraySet

    一.什么是CopyOnWrite CopyOnWrite(写时复制)简称COW,这是一种利用读写分离的思想来实现线程安全的程序设计思路.顾名思义该思想就是在写的时候将原数据复制一份,然后在新的数据中进 ...

  5. java并发编程(二十)----(JUC集合)CopyOnWriteArrayList介绍

    这一节开始我们正式来介绍JUC集合类.我们按照List.Set.Map.Queue的顺序来进行介绍.这一节我们来看一下CopyOnWriteArrayList. CopyOnWriteArrayLis ...

  6. 【JUC】CopyOnWriteArrayList

    写入时复制(CopyOnWrite) 什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器.通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进 ...

  7. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    这一节我们来接着介绍JUC集合:CopyOnWriteArraySet和ConcurrentSkipListSet.从名字上来看我们知道CopyOnWriteArraySet与上一节讲到的CopyOn ...

  8. java多线程系类:JUC集合:01之框架

    概要 之前,在"Java 集合系列目录(Category)"中,讲解了Java集合包中的各个类.接下来,将展开对JUC包中的集合进行学习.在学习之前,先温习一下"Java ...

  9. Java多线程系列--“JUC集合”01之 框架

    概要 之前,在"Java 集合系列目录(Category)"中,讲解了Java集合包中的各个类.接下来,将展开对JUC包中的集合进行学习.在学习之前,先温习一下"Java ...

随机推荐

  1. ParameterizedThreadStart task

    using System;using System.Diagnostics;using System.Threading;using System.Threading.Tasks; namespace ...

  2. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...

  3. jdk源码阅读

    转载https://www.cnblogs.com/mh-study/p/10078548.html 1.java.lang 1) Object 12) String 13) AbstractStri ...

  4. winsock 服务器代码(不建议win服务器listen防火墙会禁止外部访问的)

    int SessionBase::ServerSock() { /* 4 * WSADATA是个结构体,在WSAStartup中被填充. 5 * WSAStartup为调用WinSock准备初始化的工 ...

  5. PHP算法之分割平衡字符串

    在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...

  6. es 3.0 、es 5.0 、es 6.0

    es 5.0 的严格模式 “use strict” /在页面最顶端写启动全局 es 5.0 严格模式 为什么使用字符串可以 向下兼容 ,,不会报错 可以写在局部方法中,推荐使用 (例如 不再兼容es ...

  7. python的update方法

    b = {"c":0, "position":{}} b["position"]["IF"] = {} print(b) ...

  8. Laravel Illuminate\Http\Exceptions\PostTooLargeException

    出错原因是: 请求的post的数据比 php.ini设定的 post_max_size大的原因 解决方法: 增加php.ini中 post_max_size和upload_max_filesize的设 ...

  9. Yii2 中使用ts

    在运行环境 vagrant Ubuntu box 中安装 sass ,typescript等 安装需要的软件: sudo su -c "gem install sass" # 可选 ...

  10. pipenv的使用

    首先,确保pip install pipenv已经安装 1.新建一个文件夹,并在地址栏输入cmd,回车. 2.输入pipenv install,等待虚拟环境搭建完毕. 3.输入pipenv shell ...