java并發(fā)編程專題(四)----淺談(JUC)Lock鎖
首先我們來回憶一下上一節(jié)講過的synchronized關鍵字,該關鍵字用于給代碼段或方法加鎖,使得某一時刻它修飾的方法或代碼段只能被一個線程訪問。那么試想,當我們遇到這樣的情況:當synchronized修飾的方法或代碼段因為某種原因(IO異?;蚴莝leep方法)被阻塞了,但是鎖有沒有被釋放,那么其他線程除了等待以外什么事都做不了。當我們遇到這種情況該怎么辦呢?我們今天講到的Lock鎖將有機會為此行使他的職責。
1.為什么需要Lock
synchronized 是Java 語言層面的,是內(nèi)置的關鍵字;Lock 則是JDK 5 的J.U.C(java/util/currrent)包中出現(xiàn)的一個類,在使用時,synchronized 同步的代碼塊可以由JVM自動釋放;Lock 需要程序員在finally塊中手工釋放;synchronized是比較古老的實現(xiàn)機制,設計較早,有一些功能上的限制:
——它無法中斷一個正在等候獲得鎖的線程
——也無法通過投票得到鎖,如果不想等下去,也就沒法得到鎖。
——同步還要求鎖的釋放只能在與獲得鎖所在的堆棧幀相同的堆棧幀中進行
而且對多線程環(huán)境中,使用synchronized后,線程要么獲得鎖,執(zhí)行相應的代碼,要么無法獲得鎖處于等待狀態(tài),對于鎖的處理不靈活。而Lock提供了多種基于鎖的處理機制,比如:
- void lock(),獲取一個鎖,如果鎖當前被其他線程獲得,當前的線程將被休眠。
- boolean tryLock(),嘗試獲取一個鎖,如果當前鎖被其他線程持有,則返回false,不會使當前線程休眠。
- boolean tryLock(long timeout,TimeUnit unit),如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數(shù)給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false。
- void lockInterruptibly(),如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前線程處于休眠狀態(tài),直到或者鎖定,或者當前線程被別的線程中斷。
可見lock比synchronized提供了更細的粒度、更靈活的控制。
2.初探Lock
在jdk1.5之后,并發(fā)包中新增了Lock接口(以及相關實現(xiàn)類)用來實現(xiàn)鎖功能,其實真正的實現(xiàn)Lock接口的類就三個,ReentrantLock和ReentrantReadWriteLock的兩個內(nèi)部類(ReadLock和WriteLock實現(xiàn)了Lock的接口),下面我們來看一下Lock的類圖:

- ReentrantLock:一個可重入的互斥鎖,為lock接口的主要實現(xiàn)。
- ReentrantReadWriteLock:
- ReadWriteLock、ReadWriteLock 維護了一對相關的鎖,一個用于只讀操作,另一個用于寫入操作。
- Semaphore:一個計數(shù)信號量。
- Condition:鎖的關聯(lián)條件,目的是允許線程獲取鎖并且查看等待的某一個條件是否滿足。
- CyclicBarrier:一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點。
①首先我們來看一下Lock的用法:
Lock lock = new ReentrantLock();
lock.lock();
try{
//處理任務
}catch(Exception ex){
}finally{
lock.unlock(); //釋放鎖
}
正常使用Lock的用法最多就是這樣,ReentrantLock是Lock的實現(xiàn)類們也是最常使用的。如果采用Lock,必須主動去釋放鎖,并且在發(fā)生異常時,不會自動釋放鎖。因此一般來說,使用Lock必須在try{}catch{}塊中進行,并在finally塊釋放鎖,以保證鎖一定被被釋放,防止死鎖的發(fā)生。
②我們也可以這樣使用Lock:
Lock lock = new ReentrantLock();
if(lock.tryLock()) {
try{
//處理任務
}catch(Exception ex){
}finally{
lock.unlock(); //釋放鎖
}
}else {
//如果不能獲取鎖,則直接做其他事情
}
tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失?。存i已被其他線程獲取)則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。
這一節(jié)我們簡單了解一下Lock接口,由于Lock鎖的內(nèi)容實在是太多,包括互斥鎖,公平鎖,非公平鎖,共享鎖以及相關的條件機制,信號量機制等等,我會一點點的把他們都啃下來,下面才是我們的重頭戲。
以上就是java并發(fā)編程專題(四)----淺談(JUC)Lock鎖的詳細內(nèi)容,更多關于JAVA (JUC)LOCK鎖的資料請關注腳本之家其它相關文章!
相關文章
Spring Boot接收單個String入?yún)⒌慕鉀Q方法
這篇文章主要給大家介紹了關于Spring Boot接收單個String入?yún)⒌慕鉀Q方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11
基于spring-security 401 403錯誤自定義處理方案
這篇文章主要介紹了基于spring-security 401 403錯誤自定義處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java實現(xiàn)解析json復雜數(shù)據(jù)的方法詳解
這篇文章主要為大家詳細介紹了java如何實現(xiàn)解析json復雜數(shù)據(jù),文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以學習一下2024-01-01
PowerJob的IdGenerateService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的IdGenerateService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01

