Concurrent包下的常用并发类和普通类之间的区别
1. ConcurrentHashMap和HashMap以及Hashtable之間的區別
1.1 HashMap不是線程安全的,key和value都可為null;而Hashtable是線程安全的,代碼中要求value不為null,但是在計算key的hashcode是直接調用,所以key也不能為null。
1.2 但Hashtable是鎖住整個hash表,而ConcurrentHashMap是將hash表分為多個segment,每次操作先將映射到相應的segment,因為segment繼承了ReentrantLock,所以segment操作可以保證線程安全,這樣鎖的粒度變細,并發性能提升明顯。key和value都不能為null,因為value為null無法判斷數據不存在還是數據存在但為null,存在歧義;而對于HashMap在get(key)獲得null時,可以在不并發的情況調用contains(key)來解決歧義。
2. ConcurrenLinkedQueue和LinkedBlockingQueue之間的區別
2.1 ConcuLinkedQueue是非阻塞隊列,采用CAS+自旋保證并發的數據安全。對于寫操作較多的場景,會增加自旋的次數;但是對于多個讀操作,并不影響性能。
2.2 LinkedBlockingQueue是阻塞隊列,通過鎖機制保證數據安全。如果隊列為空,那么消費者線程被阻塞。所以適合生產者多于消費者的場景。
3. CopyOnWriteArrayList和ArrayList
3.1 CopyOnWriteArrayList在實現ArrayList的基礎上,又實現了線程安全。但不是通過加鎖來實現線程安全,因為這樣性能太低;而且對于讀操作是不更改數據的,所以多個讀操作之間不需要加鎖,只有讀寫、寫寫之間需要考慮線程安全。但是,CopyOnWriteArrayList最關鍵的是在讀寫操作并發也不阻塞讀操作,只會對多個寫操作之間進行加鎖。如果存在寫操作,那么先復制一份數據,然后更改,最終再覆蓋原始的數據,這樣在并發場景下可以高效地處理數據。
3.2 CopyOnWriteArrayList讀取數據的源碼分析——沒有加鎖操作
3.3 CopyOnWriteArrayList寫數據的源碼分析——只會進行寫操作的同步
4. CopyOnWriteArraySet
4.1 內部就是CopyOnWriteArrayList
4.2 CopyOnWriteArrayList怎么滿足CopyOnWriteArraySet的元素不重復性質
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Concurrent包下的常用并发类和普通类之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单分析及总结BlockingQueue
- 下一篇: 浅谈Java虚拟机JVM的垃圾回收机制