成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

同步容器和并發容器有用過嗎?說說看

開發 前端
本節主要給大家講了同步容器和并發容器,在并發容器中,大家要重點關注ConcurrentHashMap,在本節中直接給大家講了它的機制,聽起來可能有點懵圈。

同步容器

在之前講Java基礎的時候給大家講過集合容器框架,比如Arraylist,LinkedLsit這些熟知的,它們都不是線程安全的。在多線程環境中,去訪問這些容器就會出現并發安全問題。

那什么是同步容器,可以先簡單的理解通過使用鎖來實現同步的容器,主要的同步容器類有:

  • Vector
  • Stack
  • HashTable
  • Collections.synchronizedXXX(組成的方法)

這里給大家介紹一下Vector,很簡單,它也是實現了List接口,我們看下它的add() 和 get()方法

public synchronized E get(int index) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);

return elementData(index);
}

public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}

Vector和Hashtable是線程安全的容器類,實現同步的方式是通過對方法加鎖(sychronized)方式實現的,這樣讀寫均需要鎖操作,導致性能低下。

而即使是Vector這樣線程安全的類,在面對多線程下的復合操作的時候也是需要通過客戶端加鎖的方式保證原子性

并發容器

上面我們聊到到同步容器有一些性能的缺點,針對不同的場景,為了提高容器的并發訪問,所以我們往往會使用并發容器。

例如上節給大家講的BlockingQueue其實它也是并發容器的一種,例如CopyOnWrite容器,這里不給大家過多介紹,可以自行查閱。我們重點要說的是并發Map

ConcurrentMap接口

public interface ConcurrentMap<K, V> extends Map<K, V> {

//插入元素
V putIfAbsent(K key, V value);

//移除元素
boolean remove(Object key, Object value);

//替換元素
boolean replace(K key, V oldValue, V newValue);

//替換元素
V replace(K key, V value);
}
  • 「putIfAbsent:」如果插入的key相同,則不替換原有的value值;
  • 「remove:」增加了對value的判斷,如果要刪除的key-value不能與Map中原有的key-value對應上,則不會刪除該元素;
  • 「replace(K,V,V):」增加了對value值的判斷,如果key-oldValue能與Map中原有的key-value對應上,才進行替換操作;
  • 「replace(K,V):」與上面的replace不同的是,此replace不會對Map中原有的key-value進行比較,如果key存在則直接替換;

ConcurrentHashMap

ConcurrentHashMap同HashMap一樣也是基于散列表的map

JDK 1.7

ConcurrentHashMap在JDK 1.7中,提供了一種粒度更細的加鎖機制來實現在多線程下更高的性能,這種機制叫分段鎖(Lock Striping)。

提供的優點是:在并發環境下將實現更高的吞吐量,而在單線程環境下只損失非常小的性能。

分段鎖就是「將數據分段,對每一段數據分配一把鎖」。當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。

有些方法需要跨段,比如size()、isEmpty()、containsValue(),它們可能需要鎖定整個表而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢后,又按順序釋放所有段的鎖

ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。Segment是一種可重入鎖ReentrantLock,HashEntry則用于存儲鍵值對數據。

一個ConcurrentHashMap里包含一個Segment數組,Segment的結構和HashMap類似,是一種數組和鏈表結構, 一個Segment里包含一個HashEntry數組,每個HashEntry是一個鏈表結構的元素, 每個Segment守護著一個HashEntry數組里的元素,當對HashEntry數組的數據進行修改時,必須首先獲得它對應的Segment鎖。

JDK 1.8

而在JDK 1.8中,ConcurrentHashMap主要做了兩個優化:

同HashMap一樣,鏈表也會在長度達到8的時候轉化為紅黑樹,這樣可以提升大量沖突時候的查詢效率;

以某個位置的頭結點(鏈表的頭結點或紅黑樹的root結點)為鎖,配合自旋+CAS避免不必要的鎖開銷,進一步提升并發性能。

ConcurrentNavigableMap接口與ConcurrentSkipListMap類

ConcurrentNavigableMap接口繼承了NavigableMap接口,這個接口提供了針對給定搜索目標返回最接近匹配項的導航方法。

ConcurrentNavigableMap接口的主要實現類是ConcurrentSkipListMap類。從名字上來看,它的底層使用的是跳表(SkipList)的數據結構。它是一種”空間換時間“的數據結構,可以使用CAS來保證并發安全性。

并發Set

JDK提供了ConcurrentSkipListSet,是線程安全的有序的集合。底層是使用ConcurrentSkipListMap實現。

結束語

本節主要給大家講了同步容器和并發容器,在并發容器中,大家要重點關注ConcurrentHashMap,在本節中直接給大家講了它的機制,聽起來可能有點懵圈。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-06-10 13:56:42

Java

2022-06-15 15:14:17

Java公平鎖非公平鎖

2022-06-09 11:20:44

volatile關鍵字

2020-07-01 07:52:07

Java并發容器

2023-12-07 08:13:58

Java開發

2025-06-10 10:15:00

Java容器并發

2023-07-03 09:59:00

并發編程并發容器

2011-04-21 16:43:54

BlockingQue

2017-08-09 17:46:42

Oracle數據庫僑鑫集團云技術

2015-01-19 09:57:46

Kubernetes

2017-04-01 13:30:23

OpenStack O容器技術

2011-07-13 14:58:53

STL容器

2020-08-11 08:59:20

容器虛擬化技術

2016-08-11 08:24:39

AndroidIntentShareTestDe

2017-11-28 09:21:53

LinuxWindowsDocker

2011-07-13 15:07:48

STLC++

2021-12-06 09:57:25

容器Linux信號

2014-12-29 13:02:55

Docker容器創建go語言

2024-11-19 08:00:00

2023-06-30 08:27:20

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲色片网站 | 国产精品欧美日韩 | 亚洲一二视频 | 91久久精品国产 | 日韩在线一区二区三区 | 激情一区 | 91亚洲欧美 | 亚洲韩国精品 | www.日本国产 | 色精品视频 | 超碰在线播 | av黄色在线观看 | 老司机久久 | 久草免费在线视频 | 国产成人久久精品 | 亚洲男人网 | 国产精品一区二区欧美黑人喷潮水 | 国产偷录视频叫床高潮对白 | 欧美激情五月 | 网址黄 | 天天插天天舔 | 国产亚洲精品美女久久久久久久久久 | 亚洲一区二区三区观看 | 欧美一级片在线观看 | 99久久免费精品国产免费高清 | 在线视频91 | 天堂综合网 | 黄视频网站免费观看 | 在线看亚洲 | 福利一区视频 | 精品视频一区二区在线观看 | 国产欧美一区二区三区国产幕精品 | 中文字幕精品视频在线观看 | 日韩中文字幕 | 欧美一级小视频 | 青青草视频网 | 久久午夜国产精品www忘忧草 | 欧一区| 色综合一区二区三区 | 欧美成人精品激情在线观看 | 在线免费观看视频黄 |