JUC重要辅助类(同步组件及锁)
一、CountDownLatch(計數器)
- 原理:
CountDownLatch主要有兩個方法,當一個或多個線程調用await方法時,這些線程會阻塞。其它線程調用countDown方法會將計數器減1(調用countDown方法的線程不會阻塞),當計數器的值變為0時,await方法阻塞的線程會被喚醒,繼續執行。 - 代碼:
- CountDownLatch簡單的說就是一個線程等待,直到他所等待的其他線程都執行完成并且調用countDown()方法發出通知后,當前線程才可以繼續執行。
二、CyclicBarrier(循環柵欄)
- 原理:
CyclicBarrier 的字面意思是可循環(Cyclic)使用的屏障(Barrier)。它要做的事情是,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續干活。 線程進入屏障通過CyclicBarrier的await()方法。 - 代碼:
- cyclicBarrier是所有線程都進行等待,直到所有線程都準備好進入await()方法之后,所有線程同時開始執行!
三、Semaphore(信號燈)
- 原理:
在信號量上我們定義兩種操作:acquire(獲取) 當一個線程調用acquire操作時,它要么通過成功獲取信號量(信號量減1), 要么一直等下去,直到有線程釋放信號量,或超時。 release(釋放)實際上會將信號量的值加1,然后喚醒等待的線程。 信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發線程數的控制。例如停車場,有位就進去,進去后一定時間就出來給其他車。
信號量主要用于兩個目的,一個是用于多個共享資源的互斥使用,另一個用于并發線程數的控制。
四、FutureTask(未來任務)
在FutureTask中,AQS同步狀態被用來保存人任務的狀態,例如:正在運行、已完成或已取消。FutureTask還維護一些額外的狀態變量,用來保存計算結果或者拋出的異常。此外,他還維護一個引用,指向正在執行計算任務的線程(如果它當前處于運行狀態),因而如果任務取消,該線程就會中斷。
五、ReentrantLock(可重入鎖)
ReentrantLock重入鎖,是實現Lock接口的一個類,也是在實際編程中使用頻率很高的一個鎖,支持重入性,表示能夠對共享資源能夠重復加鎖,即當前線程獲取該鎖再次獲取不會被阻塞。在java關鍵字synchronized隱式支持重入性(關于synchronized可以看這篇文章),synchronized通過獲取自增,釋放自減的方式實現重入。與此同時,ReentrantLock還支持公平鎖和非公平鎖兩種方式。那么,要想完完全全的弄懂ReentrantLock的話,主要也就是ReentrantLock同步語義的學習:
六、ReentrantReadWriteLock(可重入讀寫鎖)
ReadWriteLock接口表示存在兩個鎖:一個讀鎖和一個寫鎖,但在基于AQS實現的ReentrantReadWriteLock中,單個AQS子類將同時管理讀取加鎖和寫入加鎖。ReentrantReadWriteLock使用了一個16位的狀態來表示寫入鎖的計數,并且使用了另一個16位的狀態來表示讀取鎖的計數。在讀取鎖上的操作將使用共享的獲取方法與釋放方法,在寫入鎖的操作將使用獨占的獲取方法是釋放方法。
AQS在內部維護了一個等待線程隊列,其中記錄了某個線程請求的是獨占訪問還是共享訪問。在ReentrantReadWriteLock中,當鎖可用時,如果位于隊列頭部的線程執行寫入操作,那么線程會得到這個鎖,如果位于隊列頭部的線程執行讀取訪問,那么隊列中在第一個寫入線程的所有線程 之前的所有線程都將得到這個鎖。
七、運動會例子
舉一個例子,開運動會,參賽名單打印出來公示,如果有修改,不可能在告示單上增加或者刪除,就是直接重出一份告示(CopyOnWriteArrayList)。開賽前準備階段,運動員要就行檢查,貼號碼牌,不可能幾個工作人員同時對一個運動員進行修改(concurrentHashmap)。運動員上跑道,5人一組,剩下的下一組,這里體現的就是(seamphore的作用,一個是用于多個共享資源的互斥使用,另一個用于并發線程數的控制),然后發令員看到5個參數選手都準備好后,便發令比賽開始,這里體現的就是(cyclicBarrier的作用:所有線程都進行等待,直到所有線程都準備好進入await()方法之后,所有線程同時開始執行!)。沖線的時候,就體現了Aotumic類的作用,反正高并發不能準確修改信息。最后領獎的時候,就是體現(CountDownLatch的作用:簡單的說就是一個線程(頒獎這個線程)等待,直到他所等待的其他線程都執行完成(所有參賽選手都完成比賽),再調用countDown()方法發出通知后,當前線程(頒獎線程)才可以繼續執行。
總結
以上是生活随笔為你收集整理的JUC重要辅助类(同步组件及锁)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何召开一次无效的会议?
- 下一篇: 了解这些后设计输入框原来这么简单