您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關synchronized和ReentrantLock可重入鎖驗證的操作方法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
一個線程已經獲得了一把鎖,則可以再多次重復獲得這把已經獲取的鎖而不會發生死鎖(可類比生活大門鎖示例)。
可重入鎖又名遞歸鎖,是指在同一個線程在外層方法獲取鎖的時候,再進入該線程的內層方法會自動獲取鎖(前提,鎖對象得是同一個對象),不會因為之前已經獲取過還沒釋放而阻塞。Java中ReentrantLock和synchronized都是可重入鎖,可重入鎖的一個優點是可一定程度避免死鎖。
package com.lau.javabase.lock; /** * 隱式鎖 */ public class ReenterSynchronizedTest { public synchronized void print(){ System.out.println("外層調用..."); //中層調用 print2(); //內層調用 print3(); } public synchronized void print2(){ System.out.println("中層調用..."); } public synchronized void print3(){ System.out.println("內層調用..."); } public static void main(String[] args) { ReenterSynchronizedTest test = new ReenterSynchronizedTest(); // test.print(); test.print4(); } /** * 同一個線程可以多次獲得同一把鎖 */ public void print4(){ synchronized (this){ System.out.println("外層調用呀..."); synchronized (this){ System.out.println("中層調用呀..."); synchronized (this){ System.out.println("內層調用呀..."); } } } } }
輸出:
外層調用呀... 中層調用呀... 內層調用呀...
package com.lau.javabase.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 顯示鎖 */ public class ReenterLockTest { public static void main(String[] args) { ReenterLockTest test = new ReenterLockTest(); test.print(); new Thread(() -> test.print2(),"t").start(); } private Lock lock = new ReentrantLock(); /** * 同一個線程可以多次獲得同一把鎖 */ public void print(){ try{ lock.lock(); lock.lock(); System.out.println("外層調用"); try{ lock.lock(); System.out.println("中層調用"); try{ lock.lock(); System.out.println("內層調用"); } finally { lock.unlock(); } } finally { lock.unlock(); } } finally { lock.unlock(); // lock.unlock(); } } public void print2(){ try{ lock.lock(); System.out.println("come on!"); } finally { lock.unlock(); } } }
輸出:
外層調用 中層調用 內層調用
看完上述內容,你們對synchronized和ReentrantLock可重入鎖驗證的操作方法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。