? ? ? ?java中基本的同步機制有synchronized,Lock等,這些機制可以實現(xiàn)并發(fā)任務(wù)共享一個資源時的同步操作烛愧。當(dāng)實現(xiàn)一些較為復(fù)雜的并發(fā)任務(wù)時,可以使用一些同步輔助類來簡化操作伤哺。
? ? ? 本節(jié)將介紹信號量(Semaphore)纸巷,CountDownLatch輔助類。
? ? ? 信號量是一種計數(shù)器厉萝,用來保護一個或多個共享資源的訪問恍飘。它是并發(fā)編程的一種基礎(chǔ)工具,大多數(shù)編程語言都提供了這種機制谴垫。
? ? ? CountDownLatch在完成一組正在其他線程中執(zhí)行的操作之前章母,它允許線程一直等待。
1.Semaphore:
如果線程要訪問一個共享資源翩剪,必須先獲得信號量乳怎,信號量就是一個計數(shù)器,如果這個計數(shù)器為0前弯,則代表這個線程將一只等待下去舞肆,直到計數(shù)器大于0,因為此時沒有多余的資源可以使用博杖。計數(shù)器大于0時椿胯,代表當(dāng)前線程可以進行共享資源的訪問,有可以使用的資源剃根,因此線程將允許使用其中的一個資源哩盲。
? ? ? 當(dāng)線程使用完某個計數(shù)器之后必須釋放信號量,將計數(shù)器加1,以用來為其他線程提供多余的資源使用廉油。否則信號量將不會被釋放惠险,也就時共享資源不會被其他線程再訪問。
semaphore.acquire() ?獲取資源抒线,即有訪問權(quán)限班巩,計數(shù)器減1.
semaphore.release() ?釋放資源,即訪問結(jié)束時釋放嘶炭,計數(shù)器+1.
用來多個任務(wù)同時獲取某類資源時進行同步訪問抱慌,比如說有100份文檔,3臺打印機眨猎,讓三臺打印機輪流工作去進行打印抑进,要防止文檔出現(xiàn)混亂打印,就要同步地進行打印操作睡陪。每一個文檔要用acquire()來獲取資源寺渗,可以進行打印操作,阻止了其他文檔的搶打兰迫。當(dāng)文檔打印完成后信殊,調(diào)用release()釋放資源,每個文檔要監(jiān)聽3個打印機的狀態(tài)汁果,當(dāng)有空閑的打印機時涡拘,立馬獲取資源進行打印。
2.CountDownLatch
也類似于一個計數(shù)器须鼎,當(dāng)一個線程鲸伴,要等待其他一個或者線程的一個或多個操作完成后再進行后續(xù)操作府蔗,可以使用CountDownLatch類晋控,等待操作使用await() 方法,來進行等待監(jiān)聽姓赤。當(dāng)其他線程完成一一組操作赡译,調(diào)用countDown()方法,來通知等待線程它已經(jīng)完成不铆,此時計數(shù)器-1蝌焚。當(dāng)計數(shù)器為0的時候,await()等待結(jié)束誓斥,執(zhí)行后續(xù)操作只洒。
比如說一個簽到會議系統(tǒng),要等待所有人都到來才能開始會議劳坑,簽到系統(tǒng)是一個線程毕谴,其他的人各自是一個線程,當(dāng)會議準(zhǔn)備好了,進行等待參與者簽到時涝开,調(diào)用await()方法循帐,后面跟上后續(xù)操作。參與者簽到這個動作是提醒了會議系統(tǒng)“我來了”舀武,調(diào)用countDown()方法拄养,計數(shù)器-1,當(dāng)所有人(或者說會議的最大人數(shù))都來到時银舱,計數(shù)器為0瘪匿,此時簽到系統(tǒng)從等待狀態(tài)變?yōu)殚_始狀態(tài),可以開始開會啦纵朋。