lock

并發(fā)編程領域豌研,有兩大核心問題:

一個是互斥妹田,即同一時刻只允許一個線程訪問共享資源;
另一個是同步鹃共,即線程之間如何通信鬼佣、協(xié)作。這兩大問題霜浴,管程都是能夠解決的沮趣。

Java SDK并發(fā)包通過Lock和Condition兩個接口來實現(xiàn)管程,

其中Lock用于解決互斥問題坷随,
Condition用于解決同步問題。

Lock 使用

synchronized申請資源的時候驻龟,如果申請不到温眉,線程直接進入阻塞狀態(tài)了,而線程進入阻塞狀態(tài)翁狐,啥都干不了类溢,也釋放不了線程已經(jīng)占有的資源。但我們希望的是:

對于“不可搶占”這個條件露懒,占用部分資源的線程進一步申請其他資源時闯冷,如果申請不到,可以主動釋放它占有的資源懈词,這樣不可搶占這個條件就破壞掉了蛇耀。
如果我們重新設計一把互斥鎖去解決這個問題,那該怎么設計呢坎弯?我覺得有三種方案纺涤。

1.能夠響應中斷。synchronized的問題是抠忘,持有鎖A后撩炊,如果嘗試獲取鎖B失敗,那么線程就進入阻塞狀態(tài)崎脉,一旦發(fā)生死鎖拧咳,就沒有任何機會來喚醒阻塞的線程。但如果阻塞狀態(tài)的線程能夠響應中斷信號囚灼,也就是說當我們給阻塞的線程發(fā)送中斷信號的時候骆膝,能夠喚醒它祭衩,那它就有機會釋放曾經(jīng)持有的鎖A。這樣就破壞了不可搶占條件了谭网。

2.支持超時汪厨。如果線程在一段時間之內沒有獲取到鎖,不是進入阻塞狀態(tài)愉择,而是返回一個錯誤劫乱,那這個線程也有機會釋放曾經(jīng)持有的鎖。這樣也能破壞不可搶占條件锥涕。

3.非阻塞地獲取鎖衷戈。如果嘗試獲取鎖失敗,并不進入阻塞狀態(tài)层坠,而是直接返回殖妇,那這個線程也有機會釋放曾經(jīng)持有的鎖。這樣也能破壞不可搶占條件破花。

創(chuàng)建的鎖的具體類名是ReentrantLock谦趣,這個翻譯過來叫可重入鎖,這個概念前面我們一直沒有介紹過座每。所謂可重入鎖前鹅,顧名思義,指的是線程可以重復獲取同一把鎖峭梳。例如下面代碼中舰绘,當線程T1執(zhí)行到 ① 處時,已經(jīng)獲取到了鎖 rtl 葱椭,當在 ① 處調用 get()方法時捂寿,會在 ② 再次對鎖 rtl 執(zhí)行加鎖操作。此時孵运,如果鎖 rtl 是可重入的秦陋,那么線程T1可以再次加鎖成功;如果鎖 rtl 是不可重入的掐松,那么線程T1此時會被阻塞踱侣。

除了可重入鎖,可能你還聽說過可重入函數(shù)大磺,可重入函數(shù)怎么理解呢抡句?指的是線程可以重復調用?顯然不是杠愧,所謂可重入函數(shù)待榔,指的是多個線程可以同時調用該函數(shù),每個線程都能得到正確結果;同時在一個線程內支持線程切換锐锣,無論被切換多少次腌闯,結果都是正確的。多線程可以同時執(zhí)行雕憔,還支持線程切換姿骏,這意味著什么呢?線程安全啊斤彼。所以分瘦,可重入函數(shù)是線程安全的。

在使用ReentrantLock的時候琉苇,你會發(fā)現(xiàn)ReentrantLock這個類有兩個構造函數(shù)嘲玫,一個是無參構造函數(shù),一個是傳入fair參數(shù)的構造函數(shù)并扇。fair參數(shù)代表的是鎖的公平策略去团,如果傳入true就表示需要構造一個公平鎖,反之則表示要構造一個非公平鎖穷蛹。

鎖的最好的實際
永遠只在更新對象的成員變量時加鎖
永遠只在訪問可變的成員變量時加鎖
永遠不在調用其他對象的方法時加鎖

class Account {
  private int balance;
  private final Lock lock
          = new ReentrantLock();
  // 轉賬
  void transfer(Account tar, int amt){
    while (true) {
      if(this.lock.tryLock()) {
        try {
          if (tar.lock.tryLock()) {
            try {
              this.balance -= amt;
              tar.balance += amt;
            } finally {
              tar.lock.unlock();
            }
          }//if
        } finally {
          this.lock.unlock();
        }
      }//if
    }//while
  }//transfer
}

會不會導致死鎖
有可能活鎖土陪,A,B兩賬戶相互轉賬肴熏,各自持有自己lock的鎖旺坠,都一直在嘗試獲取對方的鎖,形成了活鎖

能夠響應中斷扮超, 支持超時 、非阻塞的獲取鎖

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蹋肮,一起剝皮案震驚了整個濱河市出刷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯辩,老刑警劉巖馁龟,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漆魔,居然都是意外死亡坷檩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門改抡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢炼,“玉大人,你說我怎么就攤上這事阿纤【涔啵” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胰锌。 經(jīng)常有香客問我骗绕,道長,這世上最難降的妖魔是什么资昧? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任酬土,我火速辦了婚禮,結果婚禮上格带,老公的妹妹穿的比我還像新娘撤缴。我一直安慰自己,他們只是感情好践惑,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布腹泌。 她就那樣靜靜地躺著,像睡著了一般尔觉。 火紅的嫁衣襯著肌膚如雪凉袱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天侦铜,我揣著相機與錄音专甩,去河邊找鬼。 笑死钉稍,一個胖子當著我的面吹牛涤躲,可吹牛的內容都是我干的。 我是一名探鬼主播贡未,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼种樱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俊卤?” 一聲冷哼從身側響起嫩挤,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎消恍,沒想到半個月后岂昭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡狠怨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年约啊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佣赖。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恰矩,死狀恐怖,靈堂內的尸體忽然破棺而出憎蛤,到底是詐尸還是另有隱情枢里,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站栏豺,受9級特大地震影響彬碱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜奥洼,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一巷疼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灵奖,春花似錦嚼沿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擅编,卻和暖如春攀细,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爱态。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工谭贪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锦担。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓俭识,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洞渔。 傳聞我的和親對象是個殘疾皇子套媚,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353