1. 程式人生 > >java執行緒安全的容器類

java執行緒安全的容器類

四、執行緒安全的容器類

Java編碼中,我們經常需要用到容器來程式設計。在併發環境下,Java提供一些已有容器能夠支援併發。

1.Map

CollectionMap

在Map類中,提供兩種執行緒安全容器。

  • java.util.Hashtable

Hashtable和HashMap類似,都是散列表,儲存鍵值對對映。主要區別在於Hashtable是執行緒安全的。當我們檢視Hashtable原始碼的時候,可以看到Hashtable的方法都是通過synchronized來進行方法層次的同步,以達到執行緒安全的作用。

  • java.util.concurrent.ConcurrentHashMap

ConcurrentHashMap是效能更好的散列表。在兼顧執行緒安全的同時,相對於Hashtable,在效率上有很大的提高。我們可以猜想,Hashtable的執行緒安全實現是對方法進行synchronized,很明顯可以通過其他併發方式,如ReentrantLock進行優化。而ConcurrentHashMap正是採用了ReentrantLock。運用鎖分離技術,即在程式碼塊上加鎖,而不是方法上加。同時ConcurrentHashMap的一個特色是允許多個修改併發操作。這就有意思了,我們知道一般寫都是互斥的,為什麼這個還能多個同時寫呢?那是因為ConcurrentHashMap採用了內部使用段機制,將ConcurrentHashMap分成了很多小段。只要不在一個小段上寫就可以併發寫。

2. Collection

Collection

Collection部分主要是運用的CopyOnWrite機制,即寫時複製機制。從字面上就能理解什麼意思,就是當我們往一個容器裡新增元素的時候,先對這個容器進行一次複製,對副本進行寫操作。寫操作結束後,將原容器的引用指向新副本容器,就完成了寫的重新整理。

從它的實現原理,我們可以看出這種機制是存在缺點的。

1.記憶體佔用:毫無疑問,每次寫時需要首先複製一遍原容器,假如複製了很多,或者本身原容器就比較大,那麼肯定會佔用很多記憶體。可以採用壓縮容器中的元素來防止記憶體消耗過大。

2.資料一致性問題:當我們在副本中進行寫操組時,只能在最終結束後使資料同步,不能實時同步

可以看到,這種機制適用於讀操作多,寫操作少的應用場景。

  • java.util.concurrent.CopyOnWriteArrayList

    Collection類的執行緒安全容器主要都是利用的ReentrantLock實現的執行緒安全,CopyOnWriteArrayList也不例外。在併發寫的時候,需要獲取lock。讀的時候不需要進行lock

  • java.util.concurrent.CopyOnWriteArraySet

    CopyOnWriteArraySet的實現就是基於CopyOnWriteArrayList實現的,採用的裝飾器進行實現。二者的區別和List和Set的區別一樣。

  • Vector

    一般我們都不用Vector了,不過它確實也是執行緒安全的。相對於其他容器,能夠提供隨機訪問功能。

3.StringBuffer和StringBuilder

我們知道,String在進行+操作的時候,原生的String會重新新建一個String物件來完成字串拼接,明顯這種操作多了的話會加重伺服器負擔。因此我們需要的時候就會用StringBuffer和StringBuilder。這二者有什麼區別呢?

StringBuffer是執行緒安全的,StringBuilder不是。從StringBuffer的原始碼可以看到,它採用的是對方法進行synchronized實現的同步。但是加了同步機制,肯定會對效能有一定影響。

高併發情況下,對資料安全有需求,則用StringBuffer,否則用StringBuilder

相關推薦

java執行安全容器

四、執行緒安全的容器類 Java編碼中,我們經常需要用到容器來程式設計。在併發環境下,Java提供一些已有容器能夠支援併發。 1.Map 在Map類中,提供兩種執行緒安全容器。 java.util.Hashtable Hashtable和H

Java執行安全

執行緒不安全的類: HashMap LinkedHashMap TreeMap ArrayList LinkedList HashSet TreeSet LinkedHashSet StringBuilder 執行緒安全的類: ConcurrentHashMap Hasht

java 執行安全的全域性計數器-AtomicInteger原子操作

首先 , 測試一下正常程式碼 public class Test1 { public static int count = 0; public static void main(String[] args) { for (int i =

java執行安全容器有哪些?

同步容器類:使用了synchronized 1.Vector 2.HashTable 併發容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:寫時複製 5.CopyOnWriteArraySet:寫時複製 Queue: 6.C

Java執行安全的日期格式化工具

/** * 日期格式化輔助類 * * @author hkb <br> */ public final class DateUtils { /** 執行緒安全的日期格式物件 */ private static final

Java執行執行安全容器的非阻塞容器

                在併發程式設計中,會經常遇到使用容器。但是如果一個容器不是執行緒安全的,那麼他在多執行緒的插入或者

執行安全相關

不安全的原因是因為共享變數被多個執行緒呼叫而出現數據錯亂 而前面講到的鎖就是讓其同步操作,同一時刻只有一個執行緒可以操作這個變數,達到資料的一致性和同步性。  步驟 1 :  HashMap和Hashtable的區別 頂折 糾問 Has

Java執行安全與多執行開發

網際網路上充斥著對Java多執行緒程式設計的介紹,每篇文章都從不同的角度介紹並總結了該領域的內容。但大部分文章都沒有說明多執行緒的實現本質,沒能讓開發者真正“過癮”。 從Java的執行緒安全鼻祖內建鎖介紹開始,讓你瞭解內建鎖的實現邏輯和原理以及引發的效能問題,接著說明了Java多執行緒程式設計中鎖的存在是為

1.java 執行常用工具

一 Timer 定時器 Timer 類主要是用來完成定時任務的功能,比如鬧鐘這種週期性變化的事物。 ** 1 一個最簡單的定時器** 兩秒鐘後引爆一個定時炸彈。 @Test public void test() { new Timer(

java執行池ThreadPoolExecutor使用詳解

在《阿里巴巴java開發手冊》中指出了執行緒資源必須通過執行緒池提供,不允許在應用中自行顯示的建立執行緒,這樣一方面是執行緒的建立更加規範,可以合理控制開闢執行緒的數量;另一方面執行緒的細節管理交給執行緒池處理,優化了資源的開銷。而執行緒池不允許使用Executors去建立,而要通過ThreadPoolExe

java執行安全問題

併發搶票過程中,如果不加同步鎖,就會出現執行緒不安全問題,導致程式碼執行結果出現嚴重問題。另外同一個執行緒啟動多次是不允許的。package sx.test.thread;public class TicketDemo {public static void main(Str

Java-執行安全

Java-執行緒安全 0x01 什麼是執行緒安全 執行緒安全是針對某個物件來說,如果當多執行緒訪問此物件時,不用再用額外方式如同步鎖等,總能執行獲得正確結果,那就可以說這個物件程式碼執行緒安全。 0x02 Java中的執行緒安全 Java中執行緒安全強度由強到弱是: 不可

談C++執行安全容器的設計

    最近看到一本書,《C++併發程式設計實戰》,[美] Anthony Williams 著,裡面有談及執行緒安全容器的設計及實現程式碼,本人覺得這樣的設計有點問題,問題還是比較明顯的,寫在這裡,供讀者自己思考吧。      關於程式碼,可以在這裡下載: https:/

關於java執行安全問題

執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。 執行緒安全問題出現的根本原因:1. 存在著兩個或者兩個以上的執行緒。2. 多個執行緒共享了著一個資源, 而且操作資源的程式碼有多句。 執行緒安全問題的解決方案:1. 使用同步程式碼塊格式:synchroni

Java執行安全佇列Queue

在Java多執行緒應用中,佇列的使用率很高,多數生產消費模型的首選資料結構就是佇列。Java提供的執行緒安全的Queue可以分為阻塞佇列和非阻塞佇列,其中阻塞佇列的典型例子是BlockingQueue,非阻塞佇列的典型例子是ConcurrentLinkedQue

java執行安全之併發Queue(十三)

併發Queue        在併發的佇列上jdk提供了兩套實現,一個是以ConcurrentLinkedQueue為代表的高效能佇列,一個是以BlockingQueue介面為代表的阻塞佇列,無論在那種都繼承自Queue。 如圖繼承Queue共有二十四個:

java執行安全之synchronized鎖重入及出現異常鎖自動釋放(五)

科技快訊       11月16日下午訊息,以“Bring AI to Life”為主題的2017百度世界大會今天在北京國貿大酒店和北京嘉裡大酒店舉行。愛奇藝創始人兼CEO龔宇在大會上發表了主題為“愛奇藝·更懂娛樂”的主題演講,龔宇表示愛奇藝對於科技的重視與百

.NET的ConcurrentDictionary,執行安全集合

ConcurrentDictionary 是.NET 4.0裡面新增的號稱執行緒安全的集合類。 那麼自然,我們會預期ConcurrentDictionary 中的程式碼是執行緒安全的(至少幾個關鍵方法是執行緒安全的). 舉個例子,使用者可能會預期GetOrAdd中的方

java執行安全的實現方法_筆記

閱讀《深入理解java虛擬機器》後的閱讀筆記。1、 互斥同步同步時指在多個執行緒併發訪問共享資料時,保證共享資料在同一個時刻只被一個(或者是一些,使用訊號量的時候)執行緒使用。而互斥是實現同步的一種手段,臨界區,互斥量和訊號量都是主要的互斥實現方式。  1.1 在java中最

java執行安全之併發Queue

關閉 原 java執行緒安全之併發Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 閱讀數:12092更多