重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
今天就跟大家聊聊有关synchronized和ReentrantLock可重入锁验证的操作方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
创新互联是一家专注于成都网站设计、成都网站制作、外贸网站建设与策划设计,开州网站建设哪家好?创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:开州等地区。开州做网站价格咨询:18982081108
一个线程已经获得了一把锁,则可以再多次重复获得这把已经获取的锁而不会发生死锁(可类比生活大门锁示例)。
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。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可重入锁验证的操作方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。