Java锁之可重入锁和递归锁


目录

  1. Java锁之可重入锁和递归锁基本概念
  2. Java锁之可重入锁和递归锁代码验证
  3. 小结
理论,代码,小结,学习三板斧。

1. Java锁之可重入锁和递归锁基本概念


  1. 可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,线程可以进入任何一个它己经拥有的锁所同步着的代码块
  2. 现在会有点迷,看下面代码验证就会明白

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. 小结


  1. 通过上面代码可以知道,synchronized和ReentrantLock都是典型的可重入锁。
  2. 拿其中一个结果分析:
  3. 再看看概念:可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,线程可以进入任何一个它己经拥有的锁所同步着的代码块

Java锁之可重入锁和递归锁相关推荐

  1. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  2. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

  3. java condition_(原创)Java的ReentrantLock(可重入锁)下的Condition

    先来看一下这个Condition的使用场景,在LinkedBlockingQueue(链表的阻塞队列)类中包含如下的定义,通过使用lock.newCondition()方法,可以获得一个Conditi ...

  4. Java多线程系列——深入重入锁ReentrantLock

    简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为"独占锁". ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychr ...

  5. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...

  6. java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)

    1.公平锁.非公平锁 2.可重入锁(递归锁) 3.自旋锁 AtomicReference atomicReference = new AtomicReference();//原子引用线程 下面代码5秒 ...

  7. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  8. java 可重入锁 clh_Java可重入锁原理

    一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lo ...

  9. Java 中可重入锁、不可重入锁的测试

    可重入锁 指在同一个线程在外层方法获取锁的时候,进入内层方法会自动获取锁. 为了避免死锁的发生,JDK 中基本都是可重入锁. 下面我们来测试一下 synchronized 和  java.util.c ...

最新文章

  1. python socket学习
  2. 深度 | 一条查询SQL的前世今生 —— ClickHouse 源码阅读
  3. 推荐一个好用的Chrome扩展应用,管理新建标签页面的
  4. flyway配置mysql_Flyway快速上手教程
  5. pg 定时删除_postgresql AutoVacuum系统自动清理进程
  6. jsp的知识略解,只作为笔记,不作为知识参考,谢谢
  7. 对《Java编程思想》读者的一点建议
  8. 兄弟连高洛峰php教程下载_兄弟连经典PHP项目视频教程在线学习与下载-兄弟连高洛峰...
  9. PyQt设置右下角弹窗
  10. TCP传输慢问题分析
  11. Linux 火狐 flash更新
  12. 云南省昭通市领导一行莅临上海控安调研指导
  13. 深度学习基础(五):循环神经网络概念、结构及原理实现
  14. python中的 pip 和 requirements.txt 是干什么的
  15. (swing读书笔记)Swing Look And Feel(1)
  16. java开发机房动力环境监控系统 --心得体验!
  17. Java小白入门第十五弹 酒店管理系统(实例一)
  18. Bluedroid: 蓝牙协议栈源码剖析
  19. 博客营销的价值与注意事项
  20. java 2年11k工资是否辞职_初中学历,从制造业工作转行Java开发,毕业收获月薪11k

热门文章

  1. Data-Mediator专题之属性回调
  2. 远程管理,无需在机房来回穿梭
  3. 《无人机DIY》——4.2 项目1:MakerBeam机身
  4. Linux系统任务计划(at、crontab)的使用方法
  5. 科技发烧友之单反佳能700d中高端
  6. java集合概念初步介绍
  7. 使用星际译王查词(安装字典和声音引擎)
  8. CodeForces - 1284B New Year and Ascent Sequence(乱搞)
  9. mysql分表组件_利用Sharding-Jdbc组件实现分表
  10. [计算机网络]探索ICMP协议