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. Python环境出现模块找不到

    由于上周脚受伤了,修养了几天没有学习.今天去实验室发现我的编译器跑不动了,出现找不到模块的情况,很奇怪都安装了,也不会提示什么模块找不到. 查找了些资料,发现是因为某个模块的文件损坏或者被覆盖或者安装 ...

  2. sacnf遇到空格与回车问题

    看scanf输入的是多个字符还是一个字符.如果是多个字符,遇空格和回车都不会结束输入:如果是一个字符,遇空格不会结束,遇回车结束输入.如:①#include<stdio.h>        ...

  3. 《DSP using MATLAB》Problem 8.45

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  4. <后端>Flask框架

    1.Flask框架安装 简介:轻量级WEB框架,类似于简单版本的Django pip install flask 环境文件生成 pip freeze > requirement.txt 环境文件 ...

  5. NEO4J亿级数据全文索引构建优化

    NEO4J亿级数据全文索引构建优化 一.数据量规模(亿级) 二.构建索引的方式 三.构建索引发生的异常 四.全文索引代码优化 1.Java.lang.OutOfMemoryError 2.访问数据库时 ...

  6. myeclipse问题

    eclipse使用过程中发现汉字太小,几乎不可辨识. 更改办法:eclipse界面依次选择“window”–“preference”–“general”–“appearance”–“color and ...

  7. GNU 交叉工具链的介绍与使用

    常用工具介绍 名称 归属 作用 arm­linux­as binutils 编译 ARM 汇编程序 arm­linux­ar binutils 把多个.o 合并成一个.o 或静态库(.a) arm­l ...

  8. 3、docker 容器管理

    Docker容器相对于OpenStack的云主机实例,虽然他们本质上不同.我们需要基于镜像来创建容器.容器是独立运行的一个或一组应用,以及它们的运行环境.对应的,虚拟机可以理解为模拟运行的一整套操作系 ...

  9. [JZOJ3234] 阴阳

    题目 题目大意 有一棵树,每条边有\(0\)或\(1\)两种颜色. 求满足存在\((u,v)\)路径上的点\(x\)使得\((u,x)\)和\((x,v)\)路径上的两种颜色出现次数相同的点对\((u ...

  10. RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想

    摘要: RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想. 在阅读本文前,若您对RocketMQ技术感兴趣,请加入RocketMQ技术交流群 RocketMQ4.3.0版本 ...