李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
Java锁--可重入锁和递归锁简介
Leefs
2020-02-25 AM
2112℃
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
NLP
4
标签云
锁
MyBatisX
Zookeeper
SpringBoot
Spring
国产数据库改造
ajax
Jenkins
Netty
Azkaban
Yarn
并发线程
数学
MySQL
数据结构
Redis
Spark Streaming
gorm
Beego
高并发
GET和POST
递归
Python
Hbase
Linux
JavaWEB项目搭建
pytorch
链表
Typora
随笔
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭