亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

深入理解java內置鎖(synchronized)和顯式鎖(ReentrantLock)

2024-07-13 10:13:40
字體:
來源:轉載
供稿:網友

synchronized 和 Reentrantlock

多線程編程中,當代碼需要同步時我們會用到鎖。Java為我們提供了內置鎖(synchronized)和顯式鎖(ReentrantLock)兩種同步方式。顯式鎖是JDK1.5引入的,這兩種鎖有什么異同呢?是僅僅增加了一種選擇還是另有其因?本文為您一探究竟。

// synchronized關鍵字用法示例public synchronized void add(int t){// 同步方法  this.v += t;}public static synchronized void sub(int t){// 同步靜態方法  value -= t;}public int decrementAndGet(){  synchronized(obj){// 同步代碼塊    return --v;  }}

這就是內置鎖的全部用法,你已經學會了。

內置鎖使用起來非常方便,不需要顯式的獲取和釋放,任何一個對象都能作為一把內置鎖。使用內置鎖能夠解決大部分的同步場景。“任何一個對象都能作為一把內置鎖”也意味著出現synchronized關鍵字的地方,都有一個對象與之關聯,具體說來:

當synchronized作用于普通方法是,鎖對象是this;

當synchronized作用于靜態方法是,鎖對象是當前類的Class對象;

當synchronized作用于代碼塊時,鎖對象是synchronized(obj)中的這個obj。

顯式鎖

內置鎖這么好用,為什么還需多出一個顯式鎖呢?因為有些事情內置鎖是做不了的,比如:

我們想給鎖加個等待時間超時時間,超時還未獲得鎖就放棄,不至于無限等下去;

我們想以可中斷的方式獲取鎖,這樣外部線程給我們發一個中斷信號就能喚起等待鎖的線程;

我們想為鎖維持多個等待隊列,比如一個生產者隊列,一個消費者隊列,一邊提高鎖的效率。

顯式鎖(ReentrantLock)正式為了解決這些靈活需求而生。ReentrantLock的字面意思是可重入鎖,可重入的意思是線程可以同時多次請求同一把鎖,而不會自己導致自己死鎖。下面是內置鎖和顯式鎖的區別:

可定時:RenentrantLock.tryLock(long timeout, TimeUnit unit)提供了一種以定時結束等待的方式,如果線程在指定的時間內沒有獲得鎖,該方法就會返回false并結束線程等待。

可中斷:你一定見過InterruptedException,很多跟多線程相關的方法會拋出該異常,這個異常并不是一個缺陷導致的負擔,而是一種必須,或者說是一件好事??芍袛嘈越o我們提供了一種讓線程提前結束的方式(而不是非得等到線程執行結束),這對于要取消耗時的任務非常有用。對于內置鎖,線程拿不到內置鎖就會一直等待,除了獲取鎖沒有其他辦法能夠讓其結束等待。RenentrantLock.lockInterruptibly()給我們提供了一種以中斷結束等待的方式。

條件隊列(condition queue):線程在獲取鎖之后,可能會由于等待某個條件發生而進入等待狀態(內置鎖通過Object.wait()方法,顯式鎖通過Condition.await()方法),進入等待狀態的線程會掛起并自動釋放鎖,這些線程會被放入到條件隊列當中。synchronized對應的只有一個條件隊列,而ReentrantLock可以有多個條件隊列,多個隊列有什么好處呢?請往下看。

條件謂詞:線程在獲取鎖之后,有時候還需要等待某個條件滿足才能做事情,比如生產者需要等到“緩存不滿”才能往隊列里放入消息,而消費者需要等到“緩存非空”才能從隊列里取出消息。這些條件被稱作條件謂詞,線程需要先獲取鎖,然后判斷條件謂詞是否滿足,如果不滿足就不往下執行,相應的線程就會放棄執行權并自動釋放鎖。使用同一把鎖的不同的線程可能有不同的條件謂詞,如果只有一個條件隊列,當某個條件謂詞滿足時就無法判斷該喚醒條件隊列里的哪一個線程;但是如果每個條件謂詞都有一個單獨的條件隊列,當某個條件滿足時我們就知道應該喚醒對應隊列上的線程(內置鎖通過Object.notify()或者Object.notifyAll()方法喚醒,顯式鎖通過Condition.signal()或者Condition.signalAll()方法喚醒)。這就是多個條件隊列的好處。

使用內置鎖時,對象本身既是一把鎖又是一個條件隊列;使用顯式鎖時,RenentrantLock的對象是鎖,條件隊列通過RenentrantLock.newCondition()方法獲取,多次調用該方法可以得到多個條件隊列。

一個使用顯式鎖的典型示例如下:

// 顯式鎖的使用示例ReentrantLock lock = new ReentrantLock();// 獲取鎖,這是跟synchronized關鍵字對應的用法。lock.lock();try{  // your code}finally{  lock.unlock();}// 可定時,超過指定時間為得到鎖就放棄try {  lock.tryLock(10, TimeUnit.SECONDS);  try {    // your code  }finally {    lock.unlock();  }} catch (InterruptedException e1) {  // exception handling}// 可中斷,等待獲取鎖的過程中線程線程可被中斷try {  lock.lockInterruptibly();  try {    // your code  }finally {    lock.unlock();  }} catch (InterruptedException e) {  // exception handling}// 多個等待隊列,具體參考[ArrayBlockingQueue](https://github.com/CarpenterLee/JCRecipes/blob/master/markdown/ArrayBlockingQueue.md)/** Condition for waiting takes */private final Condition notEmpty = lock.newCondition();/** Condition for waiting puts */private final Condition notFull = lock.newCondition();

注意,上述代碼將unlock()放在finally塊里,這么做是必需的。顯式鎖不像內置鎖那樣會自動釋放,使用顯式鎖一定要在finally塊中手動釋放,如果獲取鎖后由于異常的原因沒有釋放鎖,那么這把鎖將永遠得不到釋放!將unlock()放在finally塊中,保證無論發生什么都能夠正常釋放。

結論

內置鎖能夠解決大部分需要同步的場景,只有在需要額外靈活性是才需要考慮顯式鎖,比如可定時、可中斷、多等待隊列等特性。

顯式鎖雖然靈活,但是需要顯式的申請和釋放,并且釋放一定要放到finally塊中,否則可能會因為異常導致鎖永遠無法釋放!這是顯式鎖最明顯的缺點。

綜上,當需要同步時請優先考慮更安全的更易用的隱式鎖。

 

注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女福利视频网站| 亚洲久久久久久久久久| 91成人天堂久久成人| 81精品国产乱码久久久久久| 欧美视频中文字幕在线| 日韩av免费看网站| 日韩中文字幕在线精品| 久久久久女教师免费一区| 国产一区二区久久精品| 7777精品久久久久久| 日本成人免费在线| 亚洲欧美中文日韩v在线观看| 综合136福利视频在线| 成人在线视频福利| 日韩激情av在线免费观看| 欧美在线欧美在线| 欧美午夜久久久| 亚洲无限乱码一二三四麻| 亚州国产精品久久久| 欧美精品激情在线观看| 欧美日韩亚洲天堂| 国模吧一区二区| 色777狠狠综合秋免鲁丝| 中文字幕亚洲一区二区三区五十路| 久久久久久亚洲精品中文字幕| 美日韩精品免费视频| 这里只有精品视频在线| 成人免费直播live| 精品国内自产拍在线观看| 亚洲伊人久久大香线蕉av| 亚洲最大福利网站| 久久国产一区二区三区| 久久久日本电影| 欧美高清电影在线看| 992tv成人免费影院| 欧美中文在线免费| 久久久亚洲影院你懂的| 美女久久久久久久| 国产亚洲欧美日韩美女| 日韩亚洲第一页| 久久久噜久噜久久综合| 日韩av123| 国产精品久久久久久av| 亚洲国产第一页| 97国产精品人人爽人人做| 亚洲精品狠狠操| 亚洲精品在线91| 夜夜嗨av一区二区三区四区| 久久久亚洲影院你懂的| 日韩在线欧美在线国产在线| 91免费看视频.| 亚洲一级黄色av| 国产成人中文字幕| 色噜噜狠狠狠综合曰曰曰88av| 日韩成人性视频| 51久久精品夜色国产麻豆| 欧美极品少妇xxxxx| 日韩中文在线视频| 欧美色视频日本高清在线观看| 亚洲网站视频福利| 日韩日本欧美亚洲| 久久久久久久久网站| 欧美高清理论片| 成人中心免费视频| 在线色欧美三级视频| 92版电视剧仙鹤神针在线观看| 国产91精品在线播放| 97视频在线观看播放| 国产91在线视频| 精品国产乱码久久久久久婷婷| 97成人精品区在线播放| 亚洲欧美日韩中文在线| 亚洲激情在线观看| 亚洲欧美精品一区二区| 国产丝袜一区二区三区| 欧美一区二区三区图| 5566日本婷婷色中文字幕97| 欧美日韩美女在线| 国产精品久久久久久久一区探花| 亚洲人成在线播放| 亚洲美女免费精品视频在线观看| 超碰日本道色综合久久综合| 欧美日韩午夜剧场| 欧美日本高清一区| 成人激情综合网| 国产日韩精品在线观看| 国产精品成人久久久久| 97国产一区二区精品久久呦| 中文字幕亚洲欧美一区二区三区| 亚洲人a成www在线影院| www.日韩免费| 亚洲欧美国产高清va在线播| 日韩av一区二区在线观看| 亚洲国产精品女人久久久| 色爱av美腿丝袜综合粉嫩av| 亚洲日本成人网| 日韩在线视频免费观看| 一本大道亚洲视频| 日韩不卡在线观看| 亚洲天堂色网站| 亚洲激情在线视频| 成人a免费视频| 精品国产一区久久久| 亚洲精品理论电影| 国产v综合v亚洲欧美久久| 国产成人在线视频| 中文字幕一区二区精品| 国内精品在线一区| 亚洲精品久久在线| 国产美女久久久| 欧美精品日韩三级| 欧美xxxx14xxxxx性爽| 九九视频直播综合网| 日韩一区二区三区国产| 中国china体内裑精亚洲片| 国产精品国语对白| 日韩欧美999| 亚洲欧美日韩国产中文专区| 国产精品久久久久久影视| 国产精品久久久久国产a级| 中文字幕国内精品| 色噜噜久久综合伊人一本| 国产精品欧美一区二区三区奶水| 欧美日本亚洲视频| 亚洲男人天堂网站| 中文日韩电影网站| 国内揄拍国内精品少妇国语| 久久久国产视频91| 欧美视频裸体精品| 日韩精品极品视频免费观看| 久久精品视频中文字幕| 日韩中文第一页| 久久99热精品这里久久精品| 国产一区二区在线免费视频| 久久久久久国产精品久久| 日韩成人小视频| 91精品久久久久| 中文字幕av一区中文字幕天堂| 日韩福利视频在线观看| 欧美精品久久久久| 91国内产香蕉| 欧美中文字幕精品| 精品国产一区二区三区四区在线观看| 欧美日韩免费区域视频在线观看| 欧美视频在线看| 亚洲精品一区二区网址| 92版电视剧仙鹤神针在线观看| 亚洲一二在线观看| 亚洲综合色激情五月| 欧美乱大交xxxxx另类电影| 久久精品视频99| 欧美日本在线视频中文字字幕| 中文字幕亚洲综合久久| 国产一区二区三区在线视频| 亚洲精品美女在线观看播放| …久久精品99久久香蕉国产| 亚洲国产精品国自产拍av秋霞| 亚洲电影免费观看高清| 丝袜一区二区三区| 中文字幕国产亚洲| 成人福利免费观看| 国产精品视频大全| 亚洲欧美日韩久久久久久| 色综合影院在线|