java并發(fā)編程之Lock接口

引言

鎖,是java se 5之后提出的萄焦,它同synchronized關鍵字一樣不恭,都是用來控制多個線程對臨界區(qū)訪問的灵妨。

Lock與synchronized之間的區(qū)別和聯(lián)系
在總結(jié)兩者的區(qū)別和聯(lián)系之前先引入兩個概念:隱式鎖顯式鎖

  • 隱式鎖:隱式獲取鎖柄瑰,synchronized是它的代表闸氮,使用者不需要關心其內(nèi)部鎖的獲取和釋放,所有的鎖的相關操作都由具體的關鍵字完成狱意;
  • 顯式鎖:顯示地獲取鎖湖苞,Lock是它的代表,需要使用者在使用的時候顯示地獲取和釋放鎖详囤。

顯式鎖和隱式鎖都實現(xiàn)了對臨界區(qū)訪問的控制财骨,但是顯式鎖提供了更靈活、更強大的接口:

  1. 隱式鎖將鎖的獲取和釋放固化了藏姐,只能先獲取再釋放隆箩;顯式鎖顯然無此約束,可以按照自己的需要來做鎖的釋放羔杨;
  2. 顯式鎖提供了可中斷獲取鎖以及超時獲取鎖等多種隱式鎖不具備的同步特性捌臊;
  3. 提供維度更小的等待與喚醒(Condition)。

就Lock接口提供的synchronized關鍵字不具備的特性做一個分析描述:

特性 描述
嘗試非阻塞獲取鎖 當前線程嘗試獲取鎖兜材,如果鎖未被其他線程獲取理澎,當前線程成功獲取并持有鎖
可中斷獲取鎖 獲取鎖的線程能夠響應中斷,當獲取到鎖的線程被中斷時曙寡,拋出中斷異常糠爬,鎖被釋放
超時獲取鎖 在指定的時間內(nèi)獲取鎖,如果在指定的時間內(nèi)未獲取到举庶,獲取鎖失敗执隧,返回

Lock的使用

案例1:

案例1

以讀寫鎖為例,Lock的使用方式很簡單户侥,只需要在需要加鎖的地方先獲取鎖镀琉,操作完成之后釋放鎖,需要注意的是:

  • 要在finally中釋放鎖蕊唐,這樣做的目的是保證在獲取到鎖之后屋摔,最終都是能夠被釋放;
  • 不要將獲取鎖的過程寫在try代碼塊中替梨,防止在獲取鎖發(fā)生異常時導致的鎖無故釋放钓试。

Lock api
Lock是一個接口署尤,定義了鎖的獲取和釋放等基本操作。

  • void lock()
    線程調(diào)用該方法獲取鎖亚侠,獲取鎖后返回;

  • void lockInterruptibly() throws InterruptedException
    可中斷地獲取鎖俗扇,和lock()方法的區(qū)別在于該方法可以響應中斷硝烂;

  • boolean tryLock()
    嘗試非阻塞獲取鎖,線程調(diào)用該方法后立刻返回铜幽,成功獲取到鎖返回true滞谢,否則返回false;

  • boolean tryLock(long time, TimeUnit unit) throws InterruptedException
    超時獲取鎖除抛,該方法在以下3中情況會返回:

    1. 在超時時間內(nèi)獲得鎖狮杨;
    2. 在超時時間被中斷;
    3. 超時時間結(jié)束仍未獲得到忽,返回false橄教。
  • void unlock()
    釋放鎖;

  • Condition newCondition()
    獲取等待通知Condition組件喘漏,該組件和當前鎖綁定护蝶,只有線程獲取到了鎖才能調(diào)用await()方法,調(diào)用后翩迈,當前線程釋放鎖持灰。

jdk中Lock接口的實現(xiàn)主要包括可重入鎖和讀寫鎖,它們也都是通過AQS來完成線程的訪問控制的负饲。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堤魁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子返十,更是在濱河造成了極大的恐慌妥泉,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吧慢,死亡現(xiàn)場離奇詭異涛漂,居然都是意外死亡,警方通過查閱死者的電腦和手機检诗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門匈仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逢慌,你說我怎么就攤上這事悠轩。” “怎么了攻泼?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵火架,是天一觀的道長鉴象。 經(jīng)常有香客問我,道長何鸡,這世上最難降的妖魔是什么纺弊? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骡男,結(jié)果婚禮上淆游,老公的妹妹穿的比我還像新娘。我一直安慰自己隔盛,他們只是感情好犹菱,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吮炕,像睡著了一般腊脱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上龙亲,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天陕凹,我揣著相機與錄音,去河邊找鬼俱笛。 笑死捆姜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的迎膜。 我是一名探鬼主播泥技,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磕仅!你這毒婦竟也來了珊豹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榕订,失蹤者是張志新(化名)和其女友劉穎店茶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫恒,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贩幻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了两嘴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛楚。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憔辫,靈堂內(nèi)的尸體忽然破棺而出趣些,到底是詐尸還是另有隱情,我是刑警寧澤贰您,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布坏平,位于F島的核電站拢操,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舶替。R本人自食惡果不足惜令境,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顾瞪。 院中可真熱鬧展父,春花似錦、人聲如沸玲昧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵延。三九已至,卻和暖如春亲配,著一層夾襖步出監(jiān)牢的瞬間尘应,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工吼虎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犬钢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓思灰,卻偏偏與公主長得像玷犹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洒疚,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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