什么叫可重入锁

什么叫可重入锁本文详细介绍了可重入锁的概念 通过实例展示了 Java 中 synchronized 和 ReentrantLoc 的可重入特性

大家好,欢迎来到IT知识分享网。

原文链接:什么叫可重入锁 – 编程屋

可重入性:就是一个线程不用释放,可以重复的获取一个锁n次,只是在释放的时候,也需要相应的释放n次。(简单来说:A线程在某上下文中或得了某锁,当A线程想要在次获取该锁时,不会应为锁已经被自己占用,而需要先等到锁的释放)假使A线程即获得了锁,又在等待锁的释放,就会造成死锁。

注意:synchronizedreentrantlock都是可重入锁

synchronized:

无需释放锁,synchronized会自动释放锁

 public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { synchronized (this) { System.out.println("第1次获取锁,这个锁是:" + this); int index = 1; while (true) { synchronized (this) { System.out.println("第" + (++index) + "次获取锁,这个锁是:" + this); } if (index == 10) { break; } } } } }).start(); }

reentrantlock:

上几次锁,就需要手动释放几次。

 public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); new Thread(() -> { try { reentrantLock.lock(); System.out.println("第1次获取这个锁,这个锁是:"+reentrantLock); int index = 1; while (true) { try { reentrantLock.lock(); System.out.println("第"+(++index)+"次获取这个锁,这个锁是:"+reentrantLock); if (index == 10 ) { break; } } finally { reentrantLock.unlock(); } } } finally { reentrantLock.unlock(); } }).start(); }

测试结果:

什么叫可重入锁

注意:如果此时少释放一次锁会出现什么情况:

正常情况(加锁和释放锁次数相同):

 public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); new Thread(() -> { try { reentrantLock.lock(); System.out.println("第1次获取这个锁,这个锁是:"+reentrantLock); int index = 1; while (true) { try { reentrantLock.lock(); System.out.println("第"+(++index)+"次获取这个锁,这个锁是:"+reentrantLock); if (index == 10 ) { break; } } finally { reentrantLock.unlock(); } } } finally { reentrantLock.unlock(); } }).start(); / * 构建第二个线程 看是否可以获取锁 */ new Thread(new Runnable() { @Override public void run() { try { reentrantLock.lock(); for (int i = 0; i < 5; i++) { System.out.println("threadName:" + Thread.currentThread().getName()); try { Thread.sleep(new Random().nextInt(200)); } catch (InterruptedException e) { e.printStackTrace(); } } } finally { reentrantLock.unlock(); } } }).start(); }

正常测试结果:

什么叫可重入锁

 异常情况(少释放一次锁):

 public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); new Thread(() -> { try { reentrantLock.lock(); System.out.println("第1次获取这个锁,这个锁是:"+reentrantLock); int index = 1; while (true) { try { reentrantLock.lock(); System.out.println("第"+(++index)+"次获取这个锁,这个锁是:"+reentrantLock); if (index == 10 ) { break; } } finally { // reentrantLock.unlock(); //锁少释放一次 } } } finally { reentrantLock.unlock(); } }).start(); / * 构建第二个线程 看是否可以获取锁 */ new Thread(new Runnable() { @Override public void run() { try { reentrantLock.lock(); for (int i = 0; i < 5; i++) { System.out.println("threadName:" + Thread.currentThread().getName()); try { Thread.sleep(new Random().nextInt(200)); } catch (InterruptedException e) { e.printStackTrace(); } } } finally { reentrantLock.unlock(); } } }).start(); }

异常结果(第二个线程一直没有获取到锁):

什么叫可重入锁

 以上只是部分内容,为了维护方便,本文已迁移到新地址:什么叫可重入锁 – 编程屋

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120812.html

(0)
上一篇 2025-10-27 13:10
下一篇 2025-10-27 13:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信