今天就跟大家聊聊有关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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。