Java锁之可重入锁和递归锁
Java锁之可重入锁和递归锁
目录
- Java锁之可重入锁和递归锁基本概念
- Java锁之可重入锁和递归锁代码验证
- 小结
理论,代码,小结,学习三板斧。
1. Java锁之可重入锁和递归锁基本概念
- 可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,
线程可以进入任何一个它己经拥有的锁所同步着的代码块
。 - 现在会有点迷,看下面代码验证就会明白
2. Java锁之可重入锁和递归锁代码验证
代码:
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class Phone implements Runnable {public synchronized void sendSMS() throws Exception {System.out.println(Thread.currentThread().getId() + "\t invoked sendSMS()");sendEmail();}public synchronized void sendEmail() throws Exception {System.out.println(Thread.currentThread().getId() + "\t #####invoked sendEmail()");}Lock lock = new ReentrantLock();@Overridepublic void run() {get();}private void get() {lock.lock();try {//线程可以进入任何一个它已经拥有的锁所同步的代码块System.out.println(Thread.currentThread().getId() + "\t invoked get()");set();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}private void set() {lock.lock();try {System.out.println(Thread.currentThread().getId() + "\t #####invoked set()");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}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();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println();System.out.println();System.out.println();Thread t3 = new Thread(phone, "t3");Thread t4 = new Thread(phone, "t4");t3.start();t4.start();}
}
编译结果:
3. 小结
- 通过上面代码可以知道,synchronized和ReentrantLock都是典型的可重入锁。
- 拿其中一个结果分析:
- 再看看概念:可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,
线程可以进入任何一个它己经拥有的锁所同步着的代码块
。
Java锁之可重入锁和递归锁相关推荐
- java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)
前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...
http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...
- java condition_(原创)Java的ReentrantLock(可重入锁)下的Condition
先来看一下这个Condition的使用场景,在LinkedBlockingQueue(链表的阻塞队列)类中包含如下的定义,通过使用lock.newCondition()方法,可以获得一个Conditi ...
- Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...
- Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等
Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...
- java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)
1.公平锁.非公平锁 2.可重入锁(递归锁) 3.自旋锁 AtomicReference atomicReference = new AtomicReference();//原子引用线程 下面代码5秒 ...
- java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...
一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...
- java 可重入锁 clh_Java可重入锁原理
一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lo ...
- Java 中可重入锁、不可重入锁的测试
可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁. 为了避免死锁的发生,JDK 中基本都是可重入锁. 下面我们来测试一下 synchronized 和 java.util.c ...
最新文章
- python socket学习
- 深度 | 一条查询SQL的前世今生 —— ClickHouse 源码阅读
- 推荐一个好用的Chrome扩展应用,管理新建标签页面的
- flyway配置mysql_Flyway快速上手教程
- pg 定时删除_postgresql AutoVacuum系统自动清理进程
- jsp的知识略解,只作为笔记,不作为知识参考,谢谢
- 对《Java编程思想》读者的一点建议
- 兄弟连高洛峰php教程下载_兄弟连经典PHP项目视频教程在线学习与下载-兄弟连高洛峰...
- PyQt设置右下角弹窗
- TCP传输慢问题分析
- Linux 火狐 flash更新
- 云南省昭通市领导一行莅临上海控安调研指导
- 深度学习基础(五):循环神经网络概念、结构及原理实现
- python中的 pip 和 requirements.txt 是干什么的
- (swing读书笔记)Swing Look And Feel(1)
- java开发机房动力环境监控系统 --心得体验!
- Java小白入门第十五弹 酒店管理系统(实例一)
- Bluedroid: 蓝牙协议栈源码剖析
- 博客营销的价值与注意事项
- java 2年11k工资是否辞职_初中学历,从制造业工作转行Java开发,毕业收获月薪11k