1、同步容器類
hashmap和hashtable的區別;hashmap底層繼承abstractmap抽象類,並實現map介面,hashtable底層繼承dictionary類並實現map介面;hashmap初始話大小為16而hashtable初始化大小為11,hashmap是非執行緒安全的而hashtable是執行緒安全的,其底層實現採用了同步機制,因此在單執行緒環境中hashtable的訪問速度比hashmap要慢,hashmap的key和value能夠為null,hashtable的key和value不能為null。hashmap和hashtable的低層資料結構都為雜湊表,他們都是通過分離鍊錶法來解決hash衝突的問題。
解決hash衝突的方法:1)分離鍊錶法,在每個桶位後面有乙個單向的鍊錶結構,當hash衝突時,將元素新增到當前桶位,鍊錶其它元素形成鍊錶結構;2)開放位址法,a、線性探測法,根據元素的hash值確定桶位,當發生hash衝突時,尋找當前位置的下乙個位置,直到找到乙個為空的桶位,容易發生一次聚焦情況,即元素佔據的桶位形成乙個區塊,使插入新的元素時花費的時間增多;b、平方探測法:插入新元素時若發生hash衝突,則查詢下乙個離當前桶位距離為i的平法的桶位,直到找到空桶位;3)再雜湊、當雜湊表的容量達到某個裝載因子或出現插入失敗時,建立乙個新的雜湊表大小為原來的兩倍,然後重新雜湊;
2、concurrenthashmap併發容器
concurrenthashmap是一種執行緒安全的基於雜湊的map,其底層實現採用了分段鎖,細化了鎖的粒度,使多個執行緒能併發的訪問該容器,相比hashtable而言,訪問效能更好;
3、copyonwritearraylist
「寫時複製」該容器能夠取代執行緒安全的vector,再迭代過程中其不用加鎖同步。執行緒寫入時會複製底層陣列建立乙個新的陣列。比如add操作時,當前執行緒獲得乙個顯示鎖,用於防止多個執行緒執行add操作時,建立多個陣列,浪費記憶體,然後該執行緒複製底層陣列在新陣列基礎上進行寫操作,寫操作完成後執行緒釋放鎖,將底層陣列的應用指向新的陣列。這個過程如果有其他執行緒對陣列進行迭代操作,它實際上是執行緒安全的,不會丟擲concurrentmodifiedexception異常,不必考慮其它執行緒修改操作的影響。
4、阻塞佇列(blockingqueue)
阻塞佇列提供可阻塞的get和put方法,當隊列為空時,take方法一直處於阻塞狀態直到佇列中有元素可用,當佇列滿時,put方法一直處於阻塞狀態,直到有空間可用。阻塞佇列支援生產者-消費者模式,該模式將「找出需要完成的工作」和「執行工作」兩部分分離開來,實現生產者和消費者的解耦。arrayblockingqueue,讀寫執行緒不能同時進行,讀寫採用同樣的顯示鎖;linkedblockingqueue,讀寫程序能夠同時進行,該類細化了鎖的粒度put和take分別採用顯示鎖進行同步,使執行緒能夠同時對佇列進行讀寫操作。
5、訊號量(semaphore)、欄柵(cyclicbarrier)、閉鎖(countdownlatch)
countdownlatch:閉鎖相當於一扇門,當執行緒執行await方法時,執行緒被阻塞,countdown方法是乙個計數器,當計數器為0時,被阻塞的執行緒重新處於執行狀態;cyclicbarrier和閉鎖功能類似,但其能夠再次使用;訊號量(semaphore)控制同時訪問某個特定資源的運算元量,acquire方法獲得許可權,release方法釋放許可權,其類似於有界阻塞對列。
java併發程式設計實踐
chapter 2 執行緒安全 常見的競爭條件包括檢查在執行,讀 改 寫.典型的檢查再執行操作為延遲初始化 if is null then.典型的讀 改 寫操作為自增運算 x 動態同步方法鎖住當前物件本身,靜態同步方法鎖住class物件 chapter 2 可見性 讀讀不需要同步,讀寫,寫寫需要.當...
java併發程式設計實踐 ThreadLocal
threadlocal 的功能,能夠為各個訪問的執行緒copy出初始化後的資源副本,因此各個訪問資源的執行緒在改變資源狀態的時候,只是改變分配給該執行緒副本的狀態,因此各個執行緒之間沒有干擾,可以按照各自設定的序列執行。對比 如下 uniqueint與itest分別為兩個integer型別的資料。u...
java併發程式設計實踐學習
1.futuretask有個簡單理解,但是例子不是非常懂,get 是返回結果,沒有結果的話阻塞,為什麼能處理耗時的計算操作呢?2.copyonwritearraylist究竟在什麼時候複製啊?2013 2 20 p294 清單14.3是什麼意思,先驗條件在 用到了 2013 2 21 p294 29...