日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUC重要辅助类(同步组件及锁)

發(fā)布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC重要辅助类(同步组件及锁) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、CountDownLatch(計數(shù)器)

  • 原理:
    CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,這些線程會阻塞。其它線程調(diào)用countDown方法會將計數(shù)器減1(調(diào)用countDown方法的線程不會阻塞),當(dāng)計數(shù)器的值變?yōu)?時,await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。
  • 代碼:
/*** @Description:* 讓一些線程阻塞直到另一些線程完成一系列操作后才被喚醒。* CountDownLatch主要有兩個方法,當(dāng)一個或多個線程調(diào)用await方法時,這些線程會阻塞。* 其它線程調(diào)用countDown方法會將計數(shù)器減1(調(diào)用countDown方法的線程不會阻塞),* 當(dāng)計數(shù)器的值變?yōu)?時,因await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。* 解釋:6個同學(xué)陸續(xù)離開教室后值班同學(xué)才可以關(guān)門。* main主線程必須要等前面6個線程完成全部工作后,自己才能開干 */ public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(6);for (int i = 1; i <=6; i++) //6個上自習(xí)的同學(xué),各自離開教室的時間不一致{new Thread(() -> {System.out.println(Thread.currentThread().getName()+"\t 號同學(xué)離開教室");countDownLatch.countDown();}, String.valueOf(i)).start();}//計數(shù)器的值變?yōu)?時,因await方法阻塞的線程會被喚醒,繼續(xù)執(zhí)行。countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t****** 班長關(guān)門走人,main線程是班長"); } }
  • 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()方法。
  • 代碼:
/*** 粗俗理解:集齊7顆龍珠就可以召喚神龍*/ public class CyclicBarrierDemo {private static final int NUMBER = 7;public static void main(String[] args){//CyclicBarrier(int parties, Runnable barrierAction) CyclicBarrier cyclicBarrier = new CyclicBarrier(NUMBER, ()->{System.out.println("*****集齊7顆龍珠就可以召喚神龍");}) ;for (int i = 1; i <= 7; i++) {new Thread(() -> {try {System.out.println(Thread.currentThread().getName()+"\t 星龍珠被收集 ");cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}, String.valueOf(i)).start();}} }
  • 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ù)的控制。
public class SemaphoreDemo {public static void main(String[] args) {//三個停車位Semaphore sp = new Semaphore(3);//停六個汽車for (int i = 1; i <=6 ; i++) {new Thread(()->{try {sp.acquire();System.out.println(Thread.currentThread().getName()+"\t號車駛?cè)胪\囄?#34;);TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"\t號車駛出停車位");} catch (InterruptedException e) {e.printStackTrace();} finally {sp.release();}},String.valueOf(i)).start();}} }

四、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í):

  • 重入性的實現(xiàn)原理;
  • 公平鎖和非公平鎖。
  • 六、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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。