Java可重入鎖的實現(xiàn)原理與應用場景
可重入鎖,從字面來理解,就是可以重復進入的鎖。
可重入鎖,也叫做遞歸鎖,指的是同一線程外層函數(shù)獲得鎖之后,內層遞歸函數(shù)仍然有獲取該鎖的代碼,但不受影響。
在JAVA環(huán)境下ReentrantLock和synchronized都是可重入鎖。
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上運行的操作步驟
我們開發(fā) SpringBoot 項目有時我們會需要打包成 war 包,放入外置的 Tomcat 中進行運行,或者使用工具idea直接啟動,便于開發(fā)調試,本文給大家分享SpringBoot項目打包成war包并部署在tomcat上運行的操作步驟,感興趣的朋友一起看看吧2024-03-03
Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析
這篇文章主要介紹了Spring框架基于AOP實現(xiàn)簡單日志管理步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Springboot使用Rabbitmq的延時隊列+死信隊列實現(xiàn)消息延期消費
本文介紹了RabbitMQ的延時隊列和死信隊列,解釋了它們的工作原理及其應用場景,延時隊列允許消息在設定的時間后被消費,結合實際案例,展示了如何實現(xiàn)和使用延時隊列和死信隊列,感興趣的朋友一起看看吧2025-01-01
使用jquery 的ajax 與 Java servlet的交互代碼實例
這篇文章主要介紹了使用jquery 的ajax 與 Java servlet的交互代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09
Java源碼解析HashMap的tableSizeFor函數(shù)
今天小編就為大家分享一篇關于Java源碼解析HashMap的tableSizeFor函數(shù),小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01

