鎖(Lock)

Lock接口與synchronized關(guān)鍵字的區(qū)別:

1.使用synchronized關(guān)鍵字將會(huì)隱式地獲取鎖,但是它將鎖的獲取和釋放固化了,也就是先獲取再釋放。當(dāng)然窃爷,這種方式簡化了同步的管理,可是擴(kuò)展性沒有顯示的鎖獲取和釋放來的好姓蜂。
2.Lock接口(以及相關(guān)實(shí)現(xiàn)類)提供了與synchronized關(guān)鍵字類似的同步功能按厘,只是在使用時(shí)需要顯式地獲取和釋放鎖。雖然它缺少了(通過synchronized塊或者方法所提供的)隱式獲取釋放鎖的便捷性钱慢,但是卻擁有了鎖獲取與釋放的可操作性逮京、可中斷的獲取鎖以 及超時(shí)獲取鎖等多種synchronized關(guān)鍵字所不具備的同步特性。

Lock使用示例:

        Lock lock = new ReentrantLock();
        lock.lock();
        try{
            do something....
        }finally {
            lock.unlock();
        }

1.在finally塊中釋放鎖束莫,目的是保證在獲取到鎖之后懒棉,最終能夠被釋放。
2.不要將獲取鎖的過程寫在try塊中览绿,因?yàn)槿绻讷@取鎖(自定義鎖的實(shí)現(xiàn))時(shí)發(fā)生了異常策严,異常拋出的同時(shí),也會(huì)導(dǎo)致鎖無故釋放饿敲。

重入鎖:

1.重入鎖ReentrantLock妻导,顧名思義,就是支持重進(jìn)入的鎖怀各,它表示該鎖能夠支持一個(gè)線程對(duì)資源的重復(fù)加鎖倔韭。
2.而synchronized關(guān)鍵字隱式的支持重進(jìn)入,比如一個(gè)synchronized修飾的遞歸方 法瓢对,在方法執(zhí)行時(shí)寿酌,執(zhí)行線程在獲取了鎖之后仍能連續(xù)多次地獲得該鎖。
3.ReentrantLock雖然沒能像synchronized關(guān)鍵字一樣支持隱式的重進(jìn)入沥曹,但是在調(diào)用lock()方 法時(shí)份名,已經(jīng)獲取到鎖的線程,能夠再次調(diào)用lock()方法獲取鎖而不被阻塞妓美。

公平鎖與非公平鎖:

1.如果在絕對(duì)時(shí)間上僵腺,先對(duì)鎖進(jìn)行獲取的請(qǐng)求一定先被滿足,那么這個(gè)鎖是公平的壶栋,反之辰如,是不公平的。公平的獲取鎖贵试,也就是等待時(shí)間最長的線 程最優(yōu)先獲取鎖琉兜,也可以說鎖獲取是順序的。2.ReentrantLock提供了一個(gè)構(gòu)造函數(shù)毙玻,能夠控制鎖是否是公平的豌蟋。
3.公平的鎖機(jī)制往往沒有非公平的效率高,但是公平鎖能夠減少“饑餓”發(fā)生的概率桑滩,等待越久的請(qǐng)求越是能夠得到優(yōu)先滿足梧疲。
4.公平性鎖保證了鎖的獲取按照FIFO原則,而代價(jià)是進(jìn)行大量的線程切換运准。非公平性鎖雖然可能造成線程“饑餓”幌氮,但極少的線程切換,保證了其更大的吞吐量胁澳。

讀寫鎖

1.排他鎖:排他鎖在同一時(shí)刻只允許一個(gè)線程進(jìn)行訪問该互,大部分鎖(如Mutex和ReentrantLock)基本都是排他鎖。
2.讀寫鎖在同一時(shí)刻可以允許多個(gè)讀線程訪問韭畸,但是在寫線程訪問時(shí)宇智,所有的讀線程和其他寫線程均被阻塞。讀寫鎖維護(hù)了一對(duì)鎖胰丁,一個(gè)讀鎖和一個(gè)寫鎖普筹,通過分離讀鎖和寫鎖,使得并發(fā)性相比一般的排他鎖有了很大提升隘马。
3.一般情況下太防,讀寫鎖的性能都會(huì)比排它鎖好,因?yàn)榇蠖鄶?shù)場景讀是多于寫的酸员。在讀多于寫 的情況下蜒车,讀寫鎖能夠提供比排它鎖更好的并發(fā)性和吞吐量。Java并發(fā)包提供讀寫鎖的實(shí)現(xiàn)是 ReentrantReadWriteLock

Condition接口:

任意一個(gè)Java對(duì)象幔嗦,都擁有一組監(jiān)視器方法(定義在java.lang.Object上)酿愧,主要包括wait()、 wait(long timeout)邀泉、notify()以及notifyAll()方法嬉挡,這些方法與synchronized同步關(guān)鍵字配合钝鸽,可以 實(shí)現(xiàn)等待/通知模式。Condition接口也提供了類似Object的監(jiān)視器方法庞钢,與Lock配合可以實(shí)現(xiàn)等 待/通知模式拔恰,但是這兩者在使用方式以及功能特性上還是有差別的。


使用示例:

package cn.itcast.day06.demo6;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Solution {
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    public void conditionWait() throws InterruptedException {
        lock.lock();
        try{
            condition.await();
        }finally {
            lock.unlock();
        }
    }
    
    public void conditionSignal(){
        lock.lock();
        try {
            condition.signal();
        }finally {
            lock.unlock();
        }
    }
}

一般都會(huì)將Condition對(duì)象作為成員變量基括。當(dāng)調(diào)用await()方法后颜懊,當(dāng)前線程會(huì) 釋放鎖并在此等待,而其他線程調(diào)用Condition對(duì)象的signal()方法风皿,通知當(dāng)前線程后河爹,當(dāng)前線程 才從await()方法返回,并且在返回前已經(jīng)獲取了鎖桐款。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咸这,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子魔眨,更是在濱河造成了極大的恐慌炊苫,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰沙,死亡現(xiàn)場離奇詭異侨艾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拓挥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門唠梨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侥啤,你說我怎么就攤上這事当叭。” “怎么了盖灸?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蚁鳖,是天一觀的道長。 經(jīng)常有香客問我赁炎,道長醉箕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任徙垫,我火速辦了婚禮讥裤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻报。我一直安慰自己己英,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布吴旋。 她就那樣靜靜地躺著损肛,像睡著了一般厢破。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上治拿,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天摩泪,我揣著相機(jī)與錄音,去河邊找鬼忍啤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仙辟,可吹牛的內(nèi)容都是我干的同波。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叠国,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼未檩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粟焊,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤冤狡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后项棠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悲雳,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年香追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了合瓢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透典,死狀恐怖晴楔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峭咒,我是刑警寧澤税弃,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站凑队,受9級(jí)特大地震影響则果,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漩氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一短条、第九天 我趴在偏房一處隱蔽的房頂上張望才菠。 院中可真熱鬧茸时,春花似錦、人聲如沸赋访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渠牲,卻和暖如春旋炒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背签杈。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工瘫镇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人答姥。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓铣除,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹦付。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尚粘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容