Java并發(fā)工具類tool

一.Semaphore? ?

Semaphore semaphore =new Semaphore(2);-----他是一個AQS的共享鎖,可以允許多個線程拿到資源

1.semaphore.acquire()? --------表示阻塞并獲取許可

public void acquire()throws InterruptedException {

????????sync.acquireSharedInterruptibly(1);? //調(diào)用此方法,通過傳參可以看出,調(diào)用一次acquire(),獲取一個公共資源

}

public final void acquireSharedInterruptibly(int arg)

throws InterruptedException {

????????????if (Thread.interrupted())? //判斷此線程是否已經(jīng)中斷

????????????????????????throw new InterruptedException();

? ????????? if (tryAcquireShared(arg) <0) //tryAcquireShared(arg)方法本質(zhì)調(diào)用Sync中的tryAcquireShared()方法,方法內(nèi)部操作看下圖解析

\color{green}{//進入此方法,說明AQS中設置的資源數(shù)已經(jīng)為0,這里進行入隊操作}

????????????????????????doAcquireSharedInterruptibly(arg);

}


線程進入后更新AQS中的資源數(shù)


線程的入隊等待操作

2.semaphore.release() ----------表示釋放許可(釋放公共資源)


主要作用:他是一個計數(shù)信號,主要需求場景是進行 資源訪問,服務限流

semaphore默認創(chuàng)建非公平鎖



二.CountDownLatch

? 1.概念:

CountDownLatch這個類能夠使一個線程等待其他線程完成各自的工作后再執(zhí)行,例如我們打游戲,加載游戲,必須所有玩家都加載成功,才能進入游戲

? 2.如何工作

CountDownLatch是通過一個計數(shù)器來實現(xiàn)的,計數(shù)器的初始值為線程的數(shù)量,每當一個線程完成了自己的任務,計數(shù)器就會減1,當計數(shù)器值到達0時,它表示所有的線程已經(jīng)完成任務,然后在閉鎖上等待線程就可以恢復執(zhí)行任務

? ? 3.API

CountDownLatch.countDown() //計數(shù)器減1

CountDownLatch.await()?//等待所有線程執(zhí)行完畢



三.CyclicBarrier

? 1.概念:

????????柵欄屏障,讓一組線程到達一個屏障(也可以叫同步點)時被阻塞,直到最后一個線程

到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續(xù)運行。

????????CyclicBarrier默認的構(gòu)造方法是CyclicBarrier(int parties),其參數(shù)表示屏障攔截的線

程數(shù)量,每個線程調(diào)用await方法告CyclicBarrier我已經(jīng)到達了屏障,然后當前線程被阻塞。

2.API

cyclicBarrier.await()

\color{red}{注意:}

CyclicBarrier必須等到所有初始化的線程都到達同步點,才能繼續(xù)執(zhí)行下一步,只要有一個沒有到達,那么其他的線程就會一直等待

CyclicBarrier和CountDownLatch還有一個區(qū)別就是CyclicBarrier是可以重復使用的

? ??????

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容