樂觀學習,樂觀生活,才能不斷前進啊!!!
我的主頁:optimistic_chen
我的專欄:c語言 ,Java
歡迎大家訪問~
創作不易,大佬們點贊鼓勵下吧~
文章目錄
- JUC組件
- ReentrantLock與synchronized的區別
- Semaphore信號量
- CountDownLatch
- 線程安全的集合類
- 多線程環境下使用ArrayList
- 多線程環境下使用隊列
- 多線程使用Hash表
- 完結
JUC組件
JUC( java.util.concurrent ) :是和多線程相關的工具。
Callable接口與之前的Runnable接口是并列關系,二者的主要區別在于對程序運行結果的獲取
但是Thread的構造方法沒有提供版本去傳入Callable對象: Thread只是一個線程,它的重點在于完成任務,而不是獲取到完成任務后的結果。
如果我們想要得到任務完成后的結果,需要有一個“中間人”幫助。
FutureTask就是這個中間人,它獲取到任務的結果,在把它交給線程,由線程來獲取FurtureTask對象,即拿到任務結果。
ReentrantLock與synchronized的區別
首先都是可重入鎖
區別:
1. synchronized是關鍵字,通過JVM內部C++實現的;ReentrantLack是Java標準庫的類
2. synchronized通過代碼塊控制加鎖解鎖;ReentrantLock需要lock/unlock方法
3. ReentrantLock還有tryLock()方法,判斷加鎖成功返回true,加鎖失敗返回false(不會阻塞)
4. ReentrantLock提供了公平鎖的效果。(默認非公平)
5. ReentrantLock搭配的等待通知機制,是Condition類。相比較wait notify來說更加強大
Semaphore信號量
本質:協調多個進程(線程)之間的資源分配,可以理解為計數器:描述資源的個數
申請一個資源,計數器-1 — P操作
釋放一個資源,計數器+1 — V操作
信號量初始值為1的情況,取值要么是1,要么是0:等價于鎖
CountDownLatch
我們使用多線程的目的是為了提高重程序運行效率,通過把一個大任務分解為多個小人物來實現,使用多個線程來解決這些小任務,從而完成大任務。那么我們如何得知,這個大任務什么時候完成?
1. 構造方法指定一個參數,描述一個拆分了多少個任務
2. 每個任務執行完成后,都調用一次countDown方法
3. 主線程重調用await方法,等待所有任務執行完畢,await返回/阻塞等待
線程安全的集合類
多線程環境下使用ArrayList
- 自己加鎖:具體情況,具體分析
- Collection.synchronizedList(new ArrayList)提前嵌套,返回的List的各種關鍵方法都是帶有synchronized
- 使用CopyOnWriteArrayList(寫時拷貝),不用鎖
多線程環境下使用隊列
1. ArrayBlockQueue:基于數組實現的阻塞隊列
2. LinkedBlockingQueue:基于鏈表實現的阻塞隊列
3. PriorityBlockingQueue:基于堆實現的帶優先級的阻塞隊列
4. TransferQueue:最多只含有一個元素的阻塞隊列
多線程使用Hash表
HashMap線程不安全
Hashtable線程安全(給public方法都加了synchronized)
ConcurrentHashMap線程安全,效率更高
因為它是按照桶級別進行加鎖,而不是給hash加一個全局鎖,降低鎖沖突概率
優化點:
1. 把鎖整個hash表 優化 為鎖桶
2. 使用原子類針對size進行維護
3. hash擴容時,化整為零
完結
可以點一個免費的贊并收藏起來~
可以點點關注,避免找不到我~ ,我的主頁:optimistic_chen
我們下期不見不散 ~ ~ ~