并发容器-CopyOnWriteSet
private final CopyOnWriteArrayList<E> al;
**
* Returns {@code true} if this set contains the specified element.
* More formally, returns {@code true} if and only if this set
* contains an element {@code e} such that
* <tt>(o==null ? e==null : o.equals(e))</tt>.
*
* @param o element whose presence in this set is to be tested
* @return {@code true} if this set contains the specified element
*/
public boolean contains(Object o) {
return al.contains(o);
} -------------CopyOnWriteArrayList---------------------
/**
* Returns {@code true} if this list contains the specified element.
* More formally, returns {@code true} if and only if this list contains
* at least one element {@code e} such that
* <tt>(o==null ? e==null : o.equals(e))</tt>.
*
* @param o element whose presence in this list is to be tested
* @return {@code true} if this list contains the specified element
*/
public boolean contains(Object o) {
Object[] elements = getArray();
return indexOf(o, elements, 0, elements.length) >= 0;
}
1 public boolean add(E e) {
2 return al.addIfAbsent(e);
3 }
4
5 -------------CopyOnWriteArrayList---------------------
6 public boolean addIfAbsent(E e) {
7 Object[] snapshot = getArray();
8 // 查找元素是否已经在数组中存在,如果存在则直接返回false,否则调用addIfAbsent(e, snapshot)
9 return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
10 addIfAbsent(e, snapshot);
11 }
12 /**
13 * A version of addIfAbsent using the strong hint that given
14 * recent snapshot does not contain e.
15 */
16 private boolean addIfAbsent(E e, Object[] snapshot) {
17 final ReentrantLock lock = this.lock;
18 lock.lock();
19 try {
20 Object[] current = getArray();
21 int len = current.length;
22 if (snapshot != current) {
23 // Optimize for lost race to another addXXX operation
24 int common = Math.min(snapshot.length, len);
25 for (int i = 0; i < common; i++)
26 if (current[i] != snapshot[i] && eq(e, current[i])) // 这里是判断common长度范围内是否有元素与e相等
27 return false;
28 if (indexOf(e, current, common, len) >= 0) // 这里是判断common长度范围外是否有元素与e相等
29 return false;
30 }
31 Object[] newElements = Arrays.copyOf(current, len + 1);
32 newElements[len] = e;
33 setArray(newElements);
34 return true;
35 } finally {
36 lock.unlock();
37 }
38 }
1 public boolean remove(Object o) {
2 return al.remove(o);
3 }
4
5 -------------CopyOnWriteArrayList---------------------
6 public boolean remove(Object o) {
7 Object[] snapshot = getArray();
8 int index = indexOf(o, snapshot, 0, snapshot.length);
9 return (index < 0) ? false : remove(o, snapshot, index);
10 }
11 private boolean remove(Object o, Object[] snapshot, int index) {
12 final ReentrantLock lock = this.lock;
13 lock.lock();
14 try {
15 Object[] current = getArray();
16 int len = current.length;
17 // 如果当前CopyOnWriteArrayList对象al已经发生变化,则再次寻找索引
18 if (snapshot != current) findIndex: {
19 int prefix = Math.min(index, len);
20 // 从[0,prefix-1]区间内找是否存在o,找到则break
21 for (int i = 0; i < prefix; i++) {
22 if (current[i] != snapshot[i] && eq(o, current[i])) {
23 index = i;
24 break findIndex;
25 }
26 }
27 // 如果在[0,prefix -1]区间内没找到且index>=len,表示index超出当前长度,返回false
28 if (index >= len)
29 return false;
30 // 这部操作是有些时候对象al发生变化,但没影响对应index位置元素。这样可以省掉一次遍历操作。
31 if (current[index] == o)
32 break findIndex;
33 index = indexOf(o, current, index, len);
34 // 在[0,index-1],[index,index],[index,len-1]都没找到,返回false
35 if (index < 0)
36 return false;
37 }
38 Object[] newElements = new Object[len - 1];
39 System.arraycopy(current, 0, newElements, 0, index);
40 System.arraycopy(current, index + 1,
41 newElements, index,
42 len - index - 1);
43 setArray(newElements);
44 return true;
45 } finally {
46 lock.unlock();
47 }
48 }
并发容器-CopyOnWriteSet的更多相关文章
- Java笔记(十六)并发容器
并发容器 一.写时复制的List和Set CopyOnWrite即写时复制,或称写时拷贝,是解决并发问题的一种重要思路. 一)CopyOnWriteArrayList 该类实现了List接口,它的用法 ...
- Java多线程-并发容器
Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- JAVA同步容器和并发容器
同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...
- java并发:同步容器&并发容器
第一节 同步容器.并发容器 1.简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同 ...
- Java面试题-并发容器和框架
1. 如何让一段程序并发的执行,并最终汇总结果? 答:使用CyclicBarrier 和CountDownLatch都可以,使用CyclicBarrier 在多个关口处将多个线程执行结果汇总,Coun ...
- Java并发——同步容器与并发容器
同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...
- Java并发编程:并发容器ConcurrentHashMap
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- Java 同步容器和并发容器
同步容器(在并发下进行迭代的读和写时并不是线程安全的) Vector.Stack.HashTable Collections类的静态工厂方法创建的类(如Collections.synchr ...
随机推荐
- python创建一个二维列表
方法一:利用for-in语句来生成一个二维列表 a = [] 2 for i in range(10): 3 a.append([]) 4 for j in range(10): 5 a[i].app ...
- 快速了解C# 8.0中“可空引用类型(Nullable reference type)”语言特性
Visual C# 8.0中引入了可空引用类型(Nullable reference type),通过编译器提供的强大功能,帮助开发人员尽可能地规避由空引用带来的代码问题.这里我大致介绍一下可空引用类 ...
- 2018ICPC南京Problem G. Pyramid
题意: 询问类似于这样的三角形中:里面正三角形的个数是多少. 思路:打表找了个规律发现就是C4n+3 1 //#include<bits/stdc++.h> 2 #include& ...
- POj1860(floyd+正权回路)
题目传送门 题意:有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 296 ...
- 攻防世界 reverse hackme
hackme XCTF 3rd-GCTF-2017 __int64 __fastcall sub_400F8E(__int64 a1, __int64 a2) { char input[136]; / ...
- IDEA中通过正则表达式批量替换空白行
快捷键Ctrl+r 填入^\s*\n,勾选Regex,Replace all
- fork、exec 和 exit 对 IPC 对象的影响
GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...
- 微信小程序实现搜索关键词高亮
目录 1,前言 2,思路 3,代码逻辑 1,前言 项目中碰到一个需求,搜索数据并且关键词要高亮显示,接到需求,马上开干.先上效果图.源码已经做成了小程序代码片段,放入了GitHub了,文章底部有源码链 ...
- day-04-列表
列表的初识 容器型数据类型,可以承载大量的数据,有序的数据 why:int bool str:'123 True 太白' str: 存储少量的数据. str:切片还是对其进行任何操作,获取的内容全都是 ...
- Android Studio的基本开发环境,配置阿里云源
原创文章,转发请注明出处. 安装Android Studio 安装文件下载地址:https://developer.android.google.cn/studio/ 下载Gradle 由于国内的网络 ...