最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java可重入鎖的實現(xiàn)原理與應用場景

 更新時間:2019年01月09日 14:30:45   作者:李燦輝  
今天小編就為大家分享一篇關于Java可重入鎖的實現(xiàn)原理與應用場景,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

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

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

在JAVA環(huán)境下ReentrantLocksynchronized都是可重入鎖。

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

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

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

可重入鎖的實現(xiàn)原理是怎么樣的?

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

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

下面是一個用synchronized實現(xiàn)的例子:

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();
    }
  }
}

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

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

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

總結

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

相關文章

  • SpringBoot項目打包成war包并部署在tomcat上運行的操作步驟

    SpringBoot項目打包成war包并部署在tomcat上運行的操作步驟

    我們開發(fā) SpringBoot 項目有時我們會需要打包成 war 包,放入外置的 Tomcat 中進行運行,或者使用工具idea直接啟動,便于開發(fā)調試,本文給大家分享SpringBoot項目打包成war包并部署在tomcat上運行的操作步驟,感興趣的朋友一起看看吧
    2024-03-03
  • 淺談Java基于Consul創(chuàng)建分布式鎖

    淺談Java基于Consul創(chuàng)建分布式鎖

    這篇文章主要介紹了淺談基于Consul創(chuàng)建分布式鎖,Consul是HashiCorp公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務發(fā)現(xiàn)與配置Consul是分布式的、高可用的、可橫向擴展的,需要的朋友可以參考下
    2023-07-07
  • Java中使用BeanMap將對象轉為Map詳解

    Java中使用BeanMap將對象轉為Map詳解

    這篇文章主要介紹了Java中使用BeanMap將對象轉為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個類,BeanMap?可以將?Java?對象的屬性作為鍵,屬性值作為對應的值,存儲在一個?Map?中,它提供了一種將?Java?對象轉換為?Map?的方式,需要的朋友可以參考下
    2024-01-01
  • Springboot集成定時器和多線程異步處理操作

    Springboot集成定時器和多線程異步處理操作

    這篇文章主要介紹了Springboot集成定時器和多線程異步處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 解決Eclipse中java文件的圖標變成空心J的問題

    解決Eclipse中java文件的圖標變成空心J的問題

    這篇文章主要介紹了解決Eclipse中java文件的圖標變成空心J的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析

    這篇文章主要介紹了Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Springboot使用Rabbitmq的延時隊列+死信隊列實現(xiàn)消息延期消費

    Springboot使用Rabbitmq的延時隊列+死信隊列實現(xiàn)消息延期消費

    本文介紹了RabbitMQ的延時隊列和死信隊列,解釋了它們的工作原理及其應用場景,延時隊列允許消息在設定的時間后被消費,結合實際案例,展示了如何實現(xiàn)和使用延時隊列和死信隊列,感興趣的朋友一起看看吧
    2025-01-01
  • Java 基于AQS實現(xiàn)自定義同步器的示例

    Java 基于AQS實現(xiàn)自定義同步器的示例

    這篇文章主要介紹了Java 基于AQS實現(xiàn)自定義同步器的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 使用jquery 的ajax 與 Java servlet的交互代碼實例

    使用jquery 的ajax 與 Java servlet的交互代碼實例

    這篇文章主要介紹了使用jquery 的ajax 與 Java servlet的交互代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java源碼解析HashMap的tableSizeFor函數(shù)

    Java源碼解析HashMap的tableSizeFor函數(shù)

    今天小編就為大家分享一篇關于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

吴江市| 苍山县| 宣城市| 英吉沙县| 和林格尔县| 平谷区| 获嘉县| 阳城县| 栾川县| 印江| 织金县| 淮安市| 邳州市| 双桥区| 武安市| 汾阳市| 五寨县| 浑源县| 民丰县| 锡林郭勒盟| 日喀则市| 云和县| 简阳市| 梧州市| 礼泉县| 深州市| 鱼台县| 梁平县| 石屏县| 工布江达县| 大方县| 太康县| 衡阳县| 博白县| 辽阳市| 林周县| 三明市| 谢通门县| 花垣县| 星座| 贡山|