天天看點

countDownLatch和Semaphore的差別和底層原理

CountDownLatch表示計數器,可以給CountDownLatch設定一個數字,一個線程調用CountDownLatch的await()将會阻塞,其他線程可以調用countDownLatch的countDown()方法來對countdownlatch中的數字減一,當數字被減成0後,所有await的線程都将被喚醒!對應的底層原理就是調用await的方法的線程會利用AQS排隊,一旦數字被減為0,則會将AQS中排隊的線程依次喚醒。

semaphore表示信号量,可以設定許可的個數,表示同時允許最多多少個線程使用該信号量,通過acquire()來擷取許可,如果沒有許可可用則線程阻塞,并通過aqs來排隊,可以通過release()方法來釋放許可,當某個線程釋放了某個許可後,會從AQS中正在排隊的第1個線程開始依次喚醒,直到沒有空閑許可。