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