李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Java锁--可重入锁和递归锁简介
Leefs
2020-02-25 AM
1544℃
0条
# Java锁--可重入锁和递归锁简介 ### 一、概念介绍 可重入锁(也叫递归锁):指的是同一线程外层函数获得锁之后,内层递归函数仍然可以获取该锁的代码,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。 **也就说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。** **作用:避免死锁。** **代码示例1** ```java class Phone{ public synchronized void sendSMS() throws Exception{ System.out.println(Thread.currentThread().getName()+"\t invoked sendSMS()"); sendEmail(); } public synchronized void sendEmail() throws Exception{ System.out.println(Thread.currentThread().getName()+"\t invoked sendEmail()"); } } public class ReenterLockDemo { public static void main(String[] args) { Phone phone = new Phone(); new Thread(()->{ try { phone.sendSMS(); } catch (Exception e) { e.printStackTrace(); } },"t1").start(); new Thread(()->{ try { phone.sendSMS(); } catch (Exception e) { e.printStackTrace(); } },"t2").start(); } } ``` **运行结果** ```java t1 invoked sendSMS() t1 invoked sendEmail() t2 invoked sendSMS() t2 invoked sendEmail() ``` **代码分析** Phone类中的sendSMS()方法和sendEmail()方法都加入同步代码块synchronized,sendSMS()方法中调用方法sendEmail()。 在主方法中通过线程调用Phone类的sendSMS()方法,当线程获得sendSMS()方法的锁的同时,也获取到了sendEmail()方法的锁。 **代码示例2** ```java class Phone2 implements Runnable{ private Lock lock = new ReentrantLock(); private void sendSMS(){ lock.lock(); try { System.out.println(Thread.currentThread().getName()+"\t invoke sendSMS"); }finally { lock.unlock(); } sendEmail(); } private void sendEmail(){ lock.lock(); try { // 线程可以进入任何一个它已经拥有锁的代码块 System.out.println(Thread.currentThread().getName()+"\t invoke sendEmail"); }finally { lock.unlock(); } } @Override public void run() { sendSMS(); } } public class ReenterLockDemo2 { public static void main(String[] args) { Phone2 phone2 = new Phone2(); Thread t1 = new Thread(phone2,"t1"); Thread t2 = new Thread(phone2,"t2"); t1.start(); t2.start(); } } ``` **运行结果** ``` t1 invoke sendSMS t1 invoke sendEmail t2 invoke sendSMS t2 invoke sendEmail ```
标签:
并发编程
,
锁
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/643.html
上一篇
Java锁--自旋锁简介
下一篇
Java锁--公平和非公平锁
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Kafka
锁
gorm
MySQL
设计模式
Linux
LeetCode刷题
FastDFS
Hive
CentOS
并发线程
Zookeeper
SQL练习题
BurpSuite
Golang
MyBatisX
VUE
nginx
SpringCloud
Map
前端
Kibana
ajax
线程池
Hadoop
Golang基础
Spark
MyBatis-Plus
Java
Stream流
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞