可重入锁详解(synchronized ReentrantLock)

可重入锁详解

概述

什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。例如

package com.test.reen;// 演示可重入锁是什么意思,可重入,就是可以重复获取相同的锁,synchronized和ReentrantLock都是可重入的// 可重入降低了编程复杂性public class WhatReentrant {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic 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();}}

package com.test.reen;import java.util.Random;import java.util.concurrent.locks.ReentrantLock;// 演示可重入锁是什么意思public class WhatReentrant2 {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();new Thread(new Runnable() {@Overridepublic void run() {try {lock.lock();System.out.println("第1次获取锁,这个锁是:" + lock);int index = 1;while (true) {try {lock.lock();System.out.println("第" + (++index) + "次获取锁,这个锁是:" + lock);try {Thread.sleep(new Random().nextInt(200));} catch (InterruptedException e) {e.printStackTrace();}if (index == 10) {break;}} finally {lock.unlock();}}} finally {lock.unlock();}}}).start();}}

可以发现没发生死锁,可以多次获取相同的锁

可重入锁有

  • synchronized

  • ReentrantLock

使用ReentrantLock的注意点

ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样

以下代码演示,加锁和释放次数不一样导致的死锁

package com.test.reen;import java.util.Random;import java.util.concurrent.locks.ReentrantLock;public class WhatReentrant3 {public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();new Thread(new Runnable() {@Overridepublic void run() {try {lock.lock();System.out.println("第1次获取锁,这个锁是:" + lock);int index = 1;while (true) {try {lock.lock();System.out.println("第" + (++index) + "次获取锁,这个锁是:" + lock);try {Thread.sleep(new Random().nextInt(200));} catch (InterruptedException e) {e.printStackTrace();}if (index == 10) {break;}} finally {//lock.unlock();// 这里故意注释,实现加锁次数和释放次数不一样}}} finally {lock.unlock();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {try {lock.lock();for (int i = 0; i < 20; i++) {System.out.println("threadName:" + Thread.currentThread().getName());try {Thread.sleep(new Random().nextInt(200));} catch (InterruptedException e) {e.printStackTrace();}}} finally {lock.unlock();}}}).start();}}

由于加锁次数和释放次数不一样,第二个线程始终无法获取到锁,导致一直在等待。

(0)

相关推荐

  • 一篇好文,带你深入了解Lock锁 !

    一篇好文,带你深入了解Lock锁 !

  • ReentrantLock

    转自:https://www.cnblogs.com/guanghe/p/13469924.html 重入锁,又称递归锁,是指在同一线程中,外部方法获取锁后,内层递归方法仍然可以获取该锁.如果锁不具备 ...

  • 关于乐观锁、悲观锁、可重入锁....

    并发编程----乐观锁.悲观锁.可重入锁-.. 作为一个Java开发多年的人来说,肯定多多少少熟悉一些锁,或者听过一些锁.今天就来做一个锁相关总结. 需要高清图,进入公众号联系我 悲观锁和乐观锁 悲观 ...

  • Synchronized和Lock的区别

    引言 在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下: 区别 1.syn ...

  • 六爻入墓详解

    六爻入墓详解

  • MySQL行锁、表锁、间隙锁详解

    前言 我们前几篇讲了索引是什么,如何使用explain分析索引使用情况,如何去优化索引,以及show profiles分析SQL语句执行资源消耗的学习.今天我们来讲讲MySQL的各种锁,这里存储引擎我 ...

  • 六亲入墓详解,夫星入墓、妻星入墓、食神入墓、日干主墓定有凶祸

    墓库之年有祸灾,最怕凶星一起来. 六亲十神谁入墓,皆主该亲有悲哀. 正印为母偏财父,正财为妻官是儿. 女官为夫食儿女,日干为己防祸灾. 注解:墓乃坟墓之墓,诸事入墓皆不吉之兆,如八字中出现凶灾的信号, ...

  • 大六壬神课金口诀:关隔锁详解

    关隔锁含义 酉上见木为关,卯上见土为隔,卯上见金为锁. 寅夹酉为关,戌夹卯为隔,酉夹卯为锁. 占此行人不通,远人不至,囚禁难脱,病孕阻隔,访人不见,逃亡不还,占物有隔,百事有阻,万事迟留. 关上见金为 ...

  • 初中数学函数重难点知识详解!

    初中数学函数重难点知识详解! 一枝寒梅初中英语数学2021-01-28 15:59:46 附加:趣味数学 收藏 举报 5 条评论 布衣89982天前 学习 回复0  沈阳无天佛祖2天前 转发了 回复1 ...

  • 【骨科小技巧】肘关节手术外侧入路详解!

    操作方式 外侧入路是肘关节手术最常用的手术入路之一.根据肌间隙和从近侧尺骨剥离肌肉方式的不同,外侧入路可分为很多种,但无论何种入路,最重要的是保护桡神经深支及骨间后神经.理论上,前臂旋前可使桡神经远离 ...

  • 三叉神经痛微血管减压术-锁孔入路视频详解---我的手术学习笔记系列

    神经外科医生都知道三叉神经痛微血管减压术(Microvascular Decompression MVD)是目前治疗三叉神经痛疗效最佳.缓解持续时间最长的方法,那为什么三叉神经痛的首选治疗方法却不是M ...

  • 『8分钟创伤』图文详解:髌骨骨折入路 显露 手术技巧,必须收藏!

    由于与非手术治疗和膝关节固定时间延长相关的骨不连发生率增加及伸膝装置肌力丧失,手术治疗移位的髌骨骨折成为标准的治疗方式.现有的手术方式包括切开复位后螺丝钉内固定或者各种张力带固定术及部分或者全部髌骨切 ...