激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java concurrency集合之CopyOnWriteArraySet_動力節點Java學院整理

Java concurrency集合之CopyOnWriteArraySet_動力節點Java學院整理

2020-11-16 15:14動力節點 Java教程

CopyOnWriteArraySet基于CopyOnWriteArrayList實現,其唯一的不同是在add時調用的是CopyOnWriteArrayList的addIfAbsent(若沒有則增加)方法

CopyOnWriteArraySet介紹

它是線程安全的無序的集合,可以將它理解成線程安全的HashSet。有意思的是,CopyOnWriteArraySet和HashSet雖然都繼承于共同的父類AbstractSet;但是,HashSet是通過“散列表(HashMap)”實現的,而CopyOnWriteArraySet則是通過“動態數組(CopyOnWriteArrayList)”實現的,并不是散列表。

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

1. 它最適合于具有以下特征的應用程序:Set 大小通常保持很小,只讀操作遠多于可變操作,需要在遍歷期間防止線程間的沖突。

2. 它是線程安全的。

3. 因為通常需要復制整個基礎數組,所以可變操作(add()、set() 和 remove() 等等)的開銷很大。

4. 迭代器支持hasNext(), next()等不可變操作,但不支持可變 remove()等 操作。

5. 使用迭代器進行遍歷的速度很快,并且不會與其他線程發生沖突。在構造迭代器時,迭代器依賴于不變的數組快照。

CopyOnWriteArraySet原理和數據結構

CopyOnWriteArraySet的數據結構,如下圖所示:

Java concurrency集合之CopyOnWriteArraySet_動力節點Java學院整理

說明:

  1. CopyOnWriteArraySet繼承于AbstractSet,這就意味著它是一個集合。

  2. CopyOnWriteArraySet包含CopyOnWriteArrayList對象,它是通過CopyOnWriteArrayList實現的。而CopyOnWriteArrayList本質是個動態數組隊列,

所以CopyOnWriteArraySet相當于通過通過動態數組實現的“集合”! CopyOnWriteArrayList中允許有重復的元素;但是,CopyOnWriteArraySet是一個集合,所以它不能有重復集合。因此,CopyOnWriteArrayList額外提供了addIfAbsent()和addAllAbsent()這兩個添加元素的API,通過這些API來添加元素時,只有當元素不存在時才執行添加操作!

至于CopyOnWriteArraySet的“線程安全”機制,和CopyOnWriteArrayList一樣,是通過volatile和互斥鎖來實現的。這個在前一章節介紹CopyOnWriteArrayList時數據結構時,已經進行了說明,這里就不再重復敘述了。

CopyOnWriteArraySet函數列表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 創建一個空 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<E> 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> T[] toArray(T[] a)

CopyOnWriteArraySet是通過CopyOnWriteArrayList實現的,它的API基本上都是通過調用CopyOnWriteArrayList的API來實現的。相信對CopyOnWriteArrayList了解的話,對CopyOnWriteArraySet的了解是水到渠成的事;所以,這里就不再對CopyOnWriteArraySet的代碼進行詳細的解析了。 

CopyOnWriteArraySet示例

下面,我們通過一個例子去對比HashSet和CopyOnWriteArraySet。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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<String> set = new HashSet<String>();
  private static Set<String> set = new CopyOnWriteArraySet<String>();
  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+", ");
    }
    System.out.println();
  }
 
  private static class MyThread extends Thread {
    MyThread(String name) {
      super(name);
    }
    @Override
    public void run() {
        int i = 0;
      while (i++ < 10) {
        // “線程名” + "-" + "序號"
        String val = Thread.currentThread().getName() + "-" + (i%6);
        set.add(val);
        // 通過“Iterator”遍歷set。
        printAll();
      }
    }
  }
}

(某一次)運行結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ta-1, tb-1, ta-1,
tb-1, ta-1,
tb-1, ta-1, ta-2,
tb-1, ta-1, ta-2, tb-1, tb-2,
ta-2, ta-1, tb-2, tb-1, ta-3,
ta-2, ta-1, tb-2, tb-1, ta-3, ta-2, tb-3,
tb-2, ta-1, ta-3, tb-1, tb-3, ta-2, ta-4,
tb-2, ta-1, ta-3, tb-1, tb-3, ta-2, ta-4, tb-2, tb-4,
ta-3, ta-1, tb-3, tb-1, ta-4, ta-2, tb-4, tb-2, ta-5,
ta-3, ta-1, tb-3, tb-1, ta-4, ta-2, tb-4, tb-2, ta-5, ta-3, tb-5,
tb-3, ta-1, ta-4, tb-1, tb-4, ta-2, ta-5, tb-2, tb-5, ta-3, ta-0,
tb-3, ta-1, ta-4, tb-1, tb-4, ta-2, ta-5, tb-2, tb-5, ta-3, ta-0, tb-3, tb-0,
ta-4, ta-1, tb-4, tb-1, ta-5, ta-2, tb-5, tb-2, ta-0, ta-3, tb-0,
tb-3, ta-1, ta-4, tb-1, tb-4, ta-2, ta-5, tb-5, ta-0, tb-0,
ta-1, tb-2, tb-1, ta-3, ta-2, tb-3, tb-2, ta-4, ta-3, tb-4, tb-3, ta-5, ta-4, tb-5, tb-4, ta-0, ta-5, tb-0,
tb-5, ta-1, ta-0, tb-1, tb-0,
ta-2, ta-1, tb-2, tb-1, ta-3, ta-2, tb-3, tb-2, ta-4, ta-3, tb-4, tb-3, ta-5, tb-5, ta-0, tb-0,
ta-4, ta-1, tb-4, tb-1, ta-5, ta-2, tb-5, tb-2, ta-0, ta-3, tb-0,
tb-3, ta-1, ta-4, tb-1, tb-4, ta-2, ta-5, tb-2, tb-5, ta-3, ta-0, tb-3, tb-0,
ta-4, tb-4, ta-5, tb-5, ta-0, tb-0,

結果說明:

由于set是集合對象,因此它不會包含重復的元素。

如果將源碼中的set改成HashSet對象時,程序會產生ConcurrentModificationException異常。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: chinese-xvideos | 噜噜噜影院 | 蜜桃视频在线免费观看 | 精品亚洲在线 | 一区二区三区日本在线观看 | 宅男噜噜噜66一区二区 | 婷婷久久综合九色综合色多多蜜臀 | 日韩视频在线观看免费视频 | 婷婷久久青草热一区二区 | 成人做爰高潮片免费视频韩国 | 国产午夜电影 | 成人性视频在线 | 亚洲一级片在线观看 | 性欧美xxxx免费岛国不卡电影 | 极品国产91在线网站 | 九九热精| h视频免费在线观看 | av在线一区二区三区四区 | 天天看夜夜爽 | 欧美一区永久视频免费观看 | www.guochanav.com| 一级啪啪片 | 黄色小视频在线免费看 | 免费av网站观看 | 色综合久久久久久久久久久 | 国产精品亚洲综合一区二区三区 | 亚洲最黄视频 | 国产成年人在线观看 | 72pao成人国产永久免费视频 | 亚洲国产精品久久久久久久久久 | 国产精选91 | 一本色道久久综合狠狠躁篇适合什么人看 | 久久国产精品久久久久久电车 | 欧美特黄一级高清免费的香蕉 | 久久久久久久久久久久久久国产 | 亚洲成人福利在线观看 | 天天透天天狠天天爱综合97 | 韩国精品视频在线观看 | 亚洲综合无码一区二区 | 精品中文字幕在线播放 | 欧美亚洲国产一区二区三区 |