国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java | 多線程】可重入鎖的概念以及示例

這篇具有很好參考價值的文章主要介紹了【Java | 多線程】可重入鎖的概念以及示例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

什么是可重入鎖(Reentrant Lock)?

可重入鎖(又名遞歸鎖)是一種特殊類型的鎖,它允許同一個線程在獲取鎖后再次進入該鎖保護的代碼塊或方法,而不需要重新獲取鎖。

說白了,可重入鎖的特點就是同一個線程可以多次獲取同一個鎖,而不會因為之前已經獲取過鎖而阻塞。

可重入鎖的一個優(yōu)點是可以一定程度避免死鎖。

舉例可重入鎖

在Java中,ReentrantLocksynchronized都是可重入鎖。

synchronized

public class ReentrantLockDemo {
    public synchronized void outerMethod() {
        System.out.println("進入外層方法");
        innerMethod();
        System.out.println("退出外層方法");
    }

    public synchronized void innerMethod() {
        System.out.println("進入內層方法");
        // Do some work
        System.out.println("退出內層方法");
    }

    public static void main(String[] args) {
        ReentrantLockDemo demo = new ReentrantLockDemo();
        demo.outerMethod();
    }
}

outerMethod外層方法 中獲取鎖的線程能夠在 innerMethod內層方法 中重新獲取同一個鎖,而不需要阻塞。

運行結果如下:

進入外層方法
進入內層方法
退出內層方法
退出外層方法

ReentrantLock

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo {
    private ReentrantLock lock = new ReentrantLock();

    public void outerMethod() {
        lock.lock(); // 獲取鎖
        try {
            System.out.println("進入外層方法");
            innerMethod();
            System.out.println("退出外層方法");
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }

    public void innerMethod() {
        lock.lock(); // 再次獲取鎖
        try {
            System.out.println("進入內層方法");
            // 執(zhí)行一些操作
            System.out.println("退出內層方法");
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }

    public static void main(String[] args) {
        ReentrantLockDemo demo = new ReentrantLockDemo();
        demo.outerMethod();
    }
}

Synchronized可重入的實現原理

事實上,每個鎖對象擁有一個鎖計數器和一個指向持有該鎖的線程的指針。

當執(zhí)行 monitorenter 指令時,如果目標鎖對象的計數器為零,那么說明它沒有被其他線程所持有,Java 虛擬機會將該鎖對象的持有線程設置為當前線程,并且將其計數器加 1。

在目標鎖對象的計數器不為零的情況下,如果鎖對象的持有線程是當前線程,那么 Java 虛擬機可以將其計數器加 1,這是因為鎖是可重入的,當前線程可以多次獲取同一個鎖。否則,如果鎖對象的持有線程不是當前線程,那么當前線程需要等待,直至持有線程釋放該鎖。

當執(zhí)行 monitorexit 指令時,Java 虛擬機則需將鎖對象的計數器減 1。如果計數器減到零,那么鎖就被釋放了。

monitorentermonitorexit 指令是 Java 字節(jié)碼中的指令,它們是由 Java 編譯器生成的。文章來源地址http://www.zghlxwxcb.cn/news/detail-857005.html

到了這里,關于【Java | 多線程】可重入鎖的概念以及示例的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 并發(fā)編程之可重入鎖ReentrantLock

    并發(fā)編程之可重入鎖ReentrantLock

    大家都知道在并發(fā)編程中一般會用到多線程技術,多線程技術可以大大增加系統QPS/TPS。但是在一些特殊的業(yè)務場景下我們需要限制線程的并發(fā)數目,比如秒殺系統、多種商品金額疊加運算等等都是需要限制線程數量。特別是在分布式微服務架構,多線程同步問題尤為明顯。一

    2023年04月25日
    瀏覽(43)
  • curator實現的zookeeper可重入鎖

    Curator是一個Apache開源的ZooKeeper客戶端庫,它提供了許多高級特性和工具類,用于簡化在分布式環(huán)境中使用ZooKeeper的開發(fā)。其中之一就是可重入鎖。 Curator提供了 InterProcessMutex 類來實現可重入鎖。以下是使用Curator實現ZooKeeper可重入鎖的示例: import org.apache.curator.framework.Curato

    2024年02月15日
    瀏覽(18)
  • Redis分布式可重入鎖實現方案

    在單進程環(huán)境下,要保證一個代碼塊的同步執(zhí)行,直接用 synchronized 或 ReetrantLock 即可。在分布式環(huán)境下,要保證多個節(jié)點的線程對代碼塊的同步訪問,就必須要用到分布式鎖方案。 分布式鎖實現方案有很多,有基于關系型數據庫行鎖實現的;有基于ZooKeeper臨時順序節(jié)

    2024年02月19日
    瀏覽(24)
  • 【redis】redis分布式鎖(二)可重入鎖+設計模式

    【redis】redis分布式鎖(二)可重入鎖+設計模式

    上一篇鏈接: 【redis】redis分布式鎖(一)手寫分布式鎖1.0~6.0 隱式鎖(即synchronized使用的鎖)默認是可重入鎖 synchronized的重入實現機理 顯式鎖也有ReentrantLock這樣的可重入鎖 結論: 下邊將使用lua腳本的方式,把可重入鎖的案例語句原子化 V1.0版本 藍色部分是重復的,可

    2024年02月03日
    瀏覽(25)
  • redis — redis cluster集群模式下如何實現批量可重入鎖?

    redis — redis cluster集群模式下如何實現批量可重入鎖?

    一、redis cluster 集群版 在Redis 3.0版本以后,Redis發(fā)布了Redis Cluster。該集群主要支持搞并發(fā)和海量數據處理等優(yōu)勢,當 Redis 在集群模式下運行時,它處理數據存儲的方式與作為單個實例運行時不同。這是因為它應該準備好跨多個節(jié)點分發(fā)數據,從而實現水平可擴展性。具體能力表

    2024年01月21日
    瀏覽(54)
  • 【分布式鎖】06-Zookeeper實現分布式鎖:可重入鎖源碼分析

    前言 前面已經講解了Redis的客戶端Redission是怎么實現分布式鎖的,大多都深入到源碼級別。 在分布式系統中,常見的分布式鎖實現方案還有Zookeeper,接下來會深入研究Zookeeper是如何來實現分布式鎖的。 Zookeeper初識 文件系統 Zookeeper維護一個類似文件系統的數據結構 image.png 每

    2024年02月22日
    瀏覽(19)
  • Linux 可重入、異步信號安全和線程安全

    Linux 可重入、異步信號安全和線程安全

    當一個被捕獲的信號被一個進程處理時,進程執(zhí)行的普通的指令序列會被一個信號處理器暫時地中斷。它首先執(zhí)行該信號處理程序中的指令。如果從信號處理程序返回(例如沒有調用exit或longjmp),則繼續(xù)執(zhí)行在捕獲到信號時進程正在執(zhí)行的正常指令序列(這和當一個硬件中

    2024年02月11日
    瀏覽(16)
  • 互斥場景重入鎖處理方案

    處理方案一:map+超時重入鎖數據結構( 注:該方案并發(fā)時可以獲取到鎖進行操作 ) 核心邏輯模擬--加超時時間 并發(fā)問題結果數據 問題 問題:鎖對象創(chuàng)建并發(fā)問題 處理方案二:map+不超時重入鎖數據結構( 注:該方案并發(fā)時可以獲取到鎖進行操作 ) 核心邏輯模擬--不加超時時間 并

    2024年02月10日
    瀏覽(23)
  • ReentrantLock是如何實現可重入性

    1 問題 ReentrantLock是如何實現可重入性的? 并且在進入鎖內之前進行了哪些判斷? 2 方法 // Sync繼承于AQS abstract static class Sync extends AbstractQueuedSynchronizer { ?... } // ReentrantLock默認是非公平鎖 public ReentrantLock() { ? ? ? ?sync = new NonfairSync(); } // 可以通過向構造方法中傳true來實現公

    2024年02月07日
    瀏覽(24)
  • 智能合約安全分析,Vyper 重入鎖漏洞全路徑分析

    智能合約安全分析,Vyper 重入鎖漏洞全路徑分析

    7 月 30 日 21:10 至 7 月 31 日 06:00 鏈上發(fā)生大規(guī)模攻擊事件,導致多個 Curve 池的資金損失。漏洞的根源都是由于特定版本的 Vyper 中出現的重入鎖故障。 通過對鏈上交易數據初步分析,我們對其攻擊的交易進行整理歸納,并對攻擊流程進一步的分析,由于攻擊涉及多個交易池。

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包