91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java并發編程之Lock是什么

發布時間:2020-07-01 09:27:42 來源:億速云 閱讀:179 作者:清晨 欄目:開發技術

這篇文章將為大家詳細講解有關java并發編程之Lock是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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

1.為什么需要Lock

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

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

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

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

而且對多線程環境中,使用synchronized后,線程要么獲得鎖,執行相應的代碼,要么無法獲得鎖處于等待狀態,對于鎖的處理不靈活。而Lock提供了多種基于鎖的處理機制,比如:

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

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

2.初探Lock

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

java并發編程之Lock是什么

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

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

  Lock lock = new ReentrantLock();
  lock.lock();
  try{
  //處理任務
  }catch(Exception ex){

  }finally{
  lock.unlock();  //釋放鎖
  }

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

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

Lock lock = new ReentrantLock();
  if(lock.tryLock()) {
     try{
       //處理任務
     }catch(Exception ex){

     }finally{
       lock.unlock();  //釋放鎖
     } 
  }else {
    //如果不能獲取鎖,則直接做其他事情  
  }

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

關于java并發編程之Lock是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

米林县| 吉林市| 汉川市| 成武县| 松溪县| 鹤峰县| 旌德县| 微博| 酉阳| 曲麻莱县| 泸定县| 海口市| 洮南市| 和静县| 南乐县| 吕梁市| 渑池县| 房山区| 钦州市| 陇川县| 东港市| 新密市| 余江县| 武隆县| 海晏县| 镇巴县| 互助| 沁源县| 镇远县| 罗平县| 宁强县| 湘阴县| 渝中区| 雷山县| 瑞金市| 平顺县| 广宁县| 五河县| 庄浪县| 黄石市| 和林格尔县|