Java執行緒隨筆(三)

2021-08-15 05:21:45 字數 1460 閱讀 6931

1)併發工具類和併發容器

1. hashmap不是執行緒安全的,hashtable效率低下,因此考慮使用concurrenthashmap

jdk1.7及以前,對hashmap中陣列進行分段鎖的機制,1600多行實現;jdk1.8採用元素鎖,鎖的是某個key,這個類的實現有6313行,顯然佔記憶體和效能比hashmap差不少。

2. concurrentskiplistmap有序map;concurrentskiplistset有序set;

思想:skiplist跳表,把鍊錶的中隨機值加入索引,然後定址時,就先對比索引,以空間換時間,效率接近紅黑樹。

3. concurrentlinkedqueue無界非阻塞佇列;

相當於linkedlist的併發實現,方法:peek:拿到頭元素不移除,poll:拿到頭元素後移除

4. copyonwritearraylist和copyonwritearrayset

寫的時候進行複製,在副本上寫,寫的過程中在原容器上讀;

在寫比較多的情況下,記憶體占用高,資料一致性弱,只能保證資料的最終一致性,不能保證資料的實時一致性,適合讀多寫少的情況。

注:多用isempty()少用size()==來判斷容器是否有值,因為size方法會鎖住整個容器

2)阻塞佇列

1.常用場景:生產者-消費者模式

2.常用方法:

在佇列滿時:add丟擲異常,offer返回結果布林值,put一直阻塞直到插入成功,offer超時退出

在隊列為空:remove丟擲異常,poll返回結果布林值,take一直阻塞,poll超時退出

檢查元素:element丟擲異常,peek返回結果布林值;

3.常用阻塞佇列

arrayblockingqueue:陣列結構組成的有界的阻塞佇列

先進先出的訪問原則,初始化時必須傳大小;take和put的時候用同一把鎖;

linkedblockingqueue:鍊錶結構組成的有界的阻塞佇列

先進先出的訪問原則,初始化時可以不傳大小;take和put的時候用不同鎖;看上去比arrayblockingqueue好

priorityblockingqueue:支援優先順序排序的無界阻塞佇列

排序,自然順序公升序排序,類自己實現compareto()方法,初始化時制定乙個comparator比較器

delayqueue:使用了優先順序佇列的無界阻塞佇列

支援延時獲取,佇列裡的元素要實現delay介面,指定多少分鐘後執行

synchronousqueue:不儲存元素的阻塞佇列

每個put操作要等take才會返回,類似接力,你接了我才走。

linkedtransferqueue:鍊錶結構組成的無界阻塞佇列

生產者put時,當前有消費者take,則生產者直接把元素傳給消費者

linkedblockingdeque:鍊錶結構組成的雙向阻塞佇列

可以在佇列的兩端插入和移除,***first頭部操作,***last尾部操作,工作竊取模式。

Java執行緒隨筆

目錄 守護執行緒 執行緒可見性 執行緒時序性 執行緒的中斷機制 基本概念 執行緒引用變數時不能直接從主記憶體中引用,如果執行緒工作記憶體中沒有該變數,則會從主記憶體中拷貝乙個副本到工作記憶體read load,在同一執行緒再度引用該字段時,有可能重新獲取副本,也有可能引用原來的副本read load...

java執行緒停止 三

例如 生產者產生隨機數,但生產者生產到數字0時,產生毒丸物件放入到生產佇列中,立即停止生產,消費者接受生產者生產的資料,簡單列印出來,當接收到毒丸物件時,消費者停止消費。public class threadcacell4 else class consumer implements runnabl...

Java執行緒池三

newcachedthreadpoll建立乙個可快取的執行緒池,如果執行緒池的大小超過了處理任務的所需要的執行緒,那麼就會 部分空閒的執行緒 60秒不執行任務 當任務數增加時,執行緒池又可以智慧型的新增新執行緒來處理任務,此執行緒池不會對大小做限制,執行緒池大小完全依賴於jvm能夠建立的最大執行緒大...