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

溫馨提示×

溫馨提示×

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

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

Java可重入鎖的實現原理與應用場景

發布時間:2020-09-04 23:40:00 來源:腳本之家 閱讀:130 作者:李燦輝 欄目:編程語言

可重入鎖,從字面來理解,就是可以重復進入的鎖。

可重入鎖,也叫做遞歸鎖,指的是同一線程外層函數獲得鎖之后,內層遞歸函數仍然有獲取該鎖的代碼,但不受影響。

在JAVA環境下ReentrantLocksynchronized都是可重入鎖。

synchronized是一個可重入鎖。在一個類中,如果synchronized方法1調用了synchronized方法2,方法2是可以正常執行的,這說明synchronized是可重入鎖。否則,在執行方法2想獲取鎖的時候,該鎖已經在執行方法1時獲取了,那么方法2將永遠得不到執行。

可重入鎖在什么場景使用呢?

可重入鎖主要用在線程需要多次進入臨界區代碼時,需要使用可重入鎖。具體的例子,比如上文中提到的一個synchronized方法需要調用另一個synchronized方法時。

可重入鎖的實現原理是怎么樣的?

加鎖時,需要判斷鎖是否已經被獲取。如果已經被獲取,則判斷獲取鎖的線程是否是當前線程。如果是當前線程,則給獲取次數加1。如果不是當前線程,則需要等待。

釋放鎖時,需要給鎖的獲取次數減1,然后判斷,次數是否為0了。如果次數為0了,則需要調用鎖的喚醒方法,讓鎖上阻塞的其他線程得到執行的機會。

下面是一個用synchronized實現的例子:

public class ReentrantTest implements Runnable {
  public synchronized void get() {
    System.out.println(Thread.currentThread().getName());
    set();
  }
  public synchronized void set() {
    System.out.println(Thread.currentThread().getName());
  }
  public void run() {
    get();
  }
  public static void main(String[] args) {
    ReentrantTest rt = new ReentrantTest();
    for(;;){
      new Thread(rt).start();
    }
  }
}

整個過程沒有發生死鎖的情況,截取一部分輸出結果如下:

Thread-8492
Thread-8492
Thread-8494
Thread-8494
Thread-8495
Thread-8495
Thread-8493
Thread-8493

set()get()同時輸出了線程名稱,表明即使遞歸使用synchronized也沒有發生死鎖,證明其是可重入的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。如果你想了解更多相關內容請查看下面相關鏈接

向AI問一下細節

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

AI

乌审旗| 庄河市| 建阳市| 武宁县| 兴山县| 上杭县| 如东县| 游戏| 都江堰市| 阜新市| 台南县| 云南省| 东乡县| 鄯善县| 永泰县| 潼关县| 汤原县| 黎川县| 合川市| 芷江| 阜阳市| 敦煌市| 香港| 临湘市| 县级市| 濮阳市| 新郑市| 信阳市| 平江县| 商都县| 邯郸市| 客服| 雷波县| 进贤县| 吉木乃县| 巴塘县| 建瓯市| 平山县| 罗江县| 昭苏县| 孟州市|