色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

瀏覽:2日期:2022-08-30 08:55:48

首先我們來回憶一下上一節(jié)講過的synchronized關(guān)鍵字,該關(guān)鍵字用于給代碼段或方法加鎖,使得某一時刻它修飾的方法或代碼段只能被一個線程訪問。那么試想,當(dāng)我們遇到這樣的情況:當(dāng)synchronized修飾的方法或代碼段因?yàn)槟撤N原因(IO異常或是sleep方法)被阻塞了,但是鎖有沒有被釋放,那么其他線程除了等待以外什么事都做不了。當(dāng)我們遇到這種情況該怎么辦呢?我們今天講到的Lock鎖將有機(jī)會為此行使他的職責(zé)。

1.為什么需要Lock

synchronized 是Java 語言層面的,是內(nèi)置的關(guān)鍵字;Lock 則是JDK 5 的J.U.C(java/util/currrent)包中出現(xiàn)的一個類,在使用時,synchronized 同步的代碼塊可以由JVM自動釋放;Lock 需要程序員在finally塊中手工釋放;synchronized是比較古老的實(shí)現(xiàn)機(jī)制,設(shè)計(jì)較早,有一些功能上的限制:

——它無法中斷一個正在等候獲得鎖的線程

——也無法通過投票得到鎖,如果不想等下去,也就沒法得到鎖。

——同步還要求鎖的釋放只能在與獲得鎖所在的堆棧幀相同的堆棧幀中進(jìn)行

而且對多線程環(huán)境中,使用synchronized后,線程要么獲得鎖,執(zhí)行相應(yīng)的代碼,要么無法獲得鎖處于等待狀態(tài),對于鎖的處理不靈活。而Lock提供了多種基于鎖的處理機(jī)制,比如:

void lock(),獲取一個鎖,如果鎖當(dāng)前被其他線程獲得,當(dāng)前的線程將被休眠。 boolean tryLock(),嘗試獲取一個鎖,如果當(dāng)前鎖被其他線程持有,則返回false,不會使當(dāng)前線程休眠。 boolean tryLock(long timeout,TimeUnit unit),如果獲取了鎖定立即返回true,如果別的線程正持有鎖,會等待參數(shù)給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false。 void lockInterruptibly(),如果獲取了鎖定立即返回,如果沒有獲取鎖定,當(dāng)前線程處于休眠狀態(tài),直到或者鎖定,或者當(dāng)前線程被別的線程中斷。

可見lock比synchronized提供了更細(xì)的粒度、更靈活的控制。

2.初探Lock

在jdk1.5之后,并發(fā)包中新增了Lock接口(以及相關(guān)實(shí)現(xiàn)類)用來實(shí)現(xiàn)鎖功能,其實(shí)真正的實(shí)現(xiàn)Lock接口的類就三個,ReentrantLock和ReentrantReadWriteLock的兩個內(nèi)部類(ReadLock和WriteLock實(shí)現(xiàn)了Lock的接口),下面我們來看一下Lock的類圖:

java并發(fā)編程專題(四)----淺談(JUC)Lock鎖

ReentrantLock:一個可重入的互斥鎖,為lock接口的主要實(shí)現(xiàn)。 ReentrantReadWriteLock: ReadWriteLock、ReadWriteLock 維護(hù)了一對相關(guān)的鎖,一個用于只讀操作,另一個用于寫入操作。 Semaphore:一個計(jì)數(shù)信號量。 Condition:鎖的關(guān)聯(lián)條件,目的是允許線程獲取鎖并且查看等待的某一個條件是否滿足。 CyclicBarrier:一個同步輔助類,它允許一組線程互相等待,直到到達(dá)某個公共屏障點(diǎn)。

①首先我們來看一下Lock的用法:

Lock lock = new ReentrantLock(); lock.lock(); try{ //處理任務(wù) }catch(Exception ex){ }finally{ lock.unlock(); //釋放鎖 }

正常使用Lock的用法最多就是這樣,ReentrantLock是Lock的實(shí)現(xiàn)類們也是最常使用的。如果采用Lock,必須主動去釋放鎖,并且在發(fā)生異常時,不會自動釋放鎖。因此一般來說,使用Lock必須在try{}catch{}塊中進(jìn)行,并在finally塊釋放鎖,以保證鎖一定被被釋放,防止死鎖的發(fā)生。

②我們也可以這樣使用Lock:

Lock lock = new ReentrantLock(); if(lock.tryLock()) { try{ //處理任務(wù) }catch(Exception ex){ }finally{ lock.unlock(); //釋放鎖 } }else { //如果不能獲取鎖,則直接做其他事情 }

tryLock()方法是有返回值的,它表示用來嘗試獲取鎖,如果獲取成功,則返回true,如果獲取失敗(即鎖已被其他線程獲取)則返回false,也就說這個方法無論如何都會立即返回。在拿不到鎖時不會一直在那等待。

這一節(jié)我們簡單了解一下Lock接口,由于Lock鎖的內(nèi)容實(shí)在是太多,包括互斥鎖,公平鎖,非公平鎖,共享鎖以及相關(guān)的條件機(jī)制,信號量機(jī)制等等,我會一點(diǎn)點(diǎn)的把他們都啃下來,下面才是我們的重頭戲。

以上就是java并發(fā)編程專題(四)----淺談(JUC)Lock鎖的詳細(xì)內(nèi)容,更多關(guān)于JAVA (JUC)LOCK鎖的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 免费99热在线观看 | 国产精品手机视频一区二区 | 2021国产精品系列一区二区 | 精品成人免费视频 | 普通话对白国产精品一级毛片 | 国产免费爱在线观看视频 | 国产精品亚洲片在线va | 精品国产亚一区二区三区 | 欧美一级成人毛片影院 | 在线观看欧洲成人免费视频 | 国产成人综合网在线观看 | 成人国产在线不卡视频 | 久夜色精品国产一区二区三区 | 涩里番资源网站在线观看 | 男人的天堂在线观看视频不卡 | 国产精品99久久久久久小说 | 俄罗斯一级毛片免费播放 | 日本爽快片100色毛片 | 国内免费视频成人精品 | 91久久精品一区二区 | 中文字幕成人在线 | 免费一级欧美片片线观看 | 国产成人免费视频精品一区二区 | 美女一级毛片免费看看 | 国产综合视频在线观看一区 | 91香蕉成人免费高清网站 | 无码免费一区二区三区免费播放 | 久久综合中文字幕一区二区三区 | 男女视频免费观看 | 亚洲理论在线观看 | 喷潮白浆 | 欧美一级xxxx俄罗斯一级 | 日韩欧美一区二区三区在线观看 | 曰本人做爰大片免费观看一 | 一级做a毛片免费视频 | 国产专区一va亚洲v天堂 | 国产黄色小视频 | 国产片在线观看狂喷潮bt天堂 | 日韩欧美一区二区精品久久 | 亚洲加勒比久久88色综合一区 | 亚洲第一狼人区 |