一.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)部操作看下圖解析
????????????????????????doAcquireSharedInterruptibly(arg);
}


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()
CyclicBarrier必須等到所有初始化的線程都到達同步點,才能繼續(xù)執(zhí)行下一步,只要有一個沒有到達,那么其他的線程就會一直等待
CyclicBarrier和CountDownLatch還有一個區(qū)別就是CyclicBarrier是可以重復使用的
? ??????
