什么是可重入锁?它有什么作用?

可重入锁,也叫做递归锁,指的是在同一线程内,外层函数获得锁之后,内层递归函数仍然可以获取到该锁。
说白了就是同一个线程再次进入同样代码时,可以再次拿到该锁。
它的作用是:防止在同一线程中多次获取锁而导致死锁发生。
在java的编程中synchronized 和 ReentrantLock都是可重入锁。

案例实战:基于synchronized下订单的可重入锁

业务场景:模仿下订单操作,先减库存,再插入订单表。

步骤1:库存加锁,订单也加锁

public class SynchronizedDemo {//模拟库存100int count=100;public synchronized void operation(){log.info("第一层锁:减库存");//模拟减库存count--;add();log.info("下订单结束库存剩余:{}",count);}private synchronized void add(){log.info("第二层锁:插入订单");try {Thread.sleep(1000*10);} catch (InterruptedException e) {e.printStackTrace();}}
}

步骤2:加个测试类

public class SynchronizedController {SynchronizedDemo synchronizedDemo=new SynchronizedDemo();@GetMapping(value = "/lock1")public void lock1(String key) {log.info("-------用户{}开始下单--------",key);this.synchronizedDemo.operation();}}

步骤3:测试体验

2020-03-08 10:47:52.038  INFO 75593 --- [nio-9090-exec-9] c.a.r.controller.SynchronizedController  : -------用户1开始下单--------
2020-03-08 10:47:52.039  INFO 75593 --- [nio-9090-exec-9] c.agan.redis.Reentrant.SynchronizedDemo  : 第一层锁:减库存
2020-03-08 10:47:52.039  INFO 75593 --- [nio-9090-exec-9] c.agan.redis.Reentrant.SynchronizedDemo  : 第二层锁:插入订单
2020-03-08 10:47:54.606  INFO 75593 --- [io-9090-exec-10] c.a.r.controller.SynchronizedController  : -------用户2开始下单--------
2020-03-08 10:47:56.613  INFO 75593 --- [nio-9090-exec-1] c.a.r.controller.SynchronizedController  : -------用户3开始下单--------
2020-03-08 10:48:02.047  INFO 75593 --- [nio-9090-exec-9] c.agan.redis.Reentrant.SynchronizedDemo  : 下订单结束库存剩余:99
2020-03-08 10:48:02.047  INFO 75593 --- [nio-9090-exec-1] c.agan.redis.Reentrant.SynchronizedDemo  : 第一层锁:减库存
2020-03-08 10:48:02.047  INFO 75593 --- [nio-9090-exec-1] c.agan.redis.Reentrant.SynchronizedDemo  : 第二层锁:插入订单
2020-03-08 10:48:12.057  INFO 75593 --- [nio-9090-exec-1] c.agan.redis.Reentrant.SynchronizedDemo  : 下订单结束库存剩余:98
2020-03-08 10:48:12.057  INFO 75593 --- [io-9090-exec-10] c.agan.redis.Reentrant.SynchronizedDemo  : 第一层锁:减库存
2020-03-08 10:48:12.057  INFO 75593 --- [io-9090-exec-10] c.agan.redis.Reentrant.SynchronizedDemo  : 第二层锁:插入订单
2020-03-08 10:48:22.064  INFO 75593 --- [io-9090-exec-10] c.agan.redis.Reentrant.SynchronizedDemo  : 下订单结束库存剩余:97

通过测试结果:
1.发送了3次请求,springboot启用了3条线程来处理,分别是nio-9090-exec-9 io-9090-exec-10 nio-9090-exec-1
2.nio-9090-exec-9线程,在operation()方法内能正常调用add(),即证明了Synchronized是可重入锁
3.只有当nio-9090-exec-9线程执行完后,才能执行io-9090-exec-10 nio-9090-exec-1,为什么?
因为线程之间的请求都被锁住了,也证明了Synchronized在不同的线程之间是不可重入的。

synchronized可重入锁相关推荐

  1. 多线程复习总结之解析Synchronized与重入锁

    引言 在Java里面,最基本的互斥同步手段就是synchronized关键字,常被人成为重量级锁,这是一种块结构(Block Structured)的同步语法.synchronized是Java语言中 ...

  2. Java面试之锁-可重入锁和递归锁

    可重入锁和递归锁ReentrantLock 概念 可重入锁就是递归锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码. 在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取 ...

  3. 到底什么是重入锁,拜托,一次搞清楚!

    相信大家在工作或者面试过程中经常听到重入锁这个概念,或者与关键字 synchrozied 的对比,栈长面试了这么多人,80%的面试者都没有答对或没有答到点上,或者把双重效验锁搞混了,哭笑不得.. 那么 ...

  4. 可重入锁和不可重入锁详解

    目录 概念: 通俗理解: 可重入锁的工作原理: ReenTrantLock可重入锁和synchronized的区别: ReentrantLock源码分析: 可重入锁代码演示: 概念: Reentran ...

  5. 可重入锁 介绍以及原理

    可重入锁介绍 首先,在Synchronized和ReentrantLock的区别中,我们介绍了两者都是可重入锁,那么究竟什么是可重入锁呢?其内部原理又是如何实现的呢? 概念:可重入锁意味着:若一个程序 ...

  6. JUC - 多线程之悲观锁、乐观锁,读写锁(共享锁、独享锁),公平非公平锁,可重入锁,自旋锁,死锁(十)

    Java中主要有如下锁 一.悲观锁.乐观锁 悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronize ...

  7. synchronized 与 Reentrant均为可重入锁 区别后者比前者增加了长时等待可中断 设置是否公平锁 绑定多个条件

    ① 两者都是可重入锁 两者都是可重入锁."可重入锁"概念是:自己可以再次获取自己的内部锁.比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时 ...

  8. 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)

    在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...

  9. ReenTrantLock可重入锁(和synchronized的区别)总结

    ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...

最新文章

  1. 怎么修改php.in的时间,melongin怎么设置
  2. 在windows下将Tomcat设置为自动启动的服务
  3. BIM+GIS应用实战(听课笔记)
  4. 如何对用户进行细分-邮件营销中用户细分的方法
  5. 硬件芯片选型原理图设计
  6. 应用zip压缩的javascript以及Egret H5游戏实战
  7. 项目部署时,linux环境配置问题
  8. c++解释--百度百科
  9. mysql事件关闭解决办法
  10. 网络安全实验7 防火墙 Iptables应用
  11. 入选互联网名人堂的三位中国人
  12. vue 前端打印pdf
  13. bugkuCTF—杂项—旋转跳跃
  14. 软件测试报告编写指南
  15. qwebkit的套壳开发
  16. django报错ERRORS:?: (admin.E402) ‘django.contrib.auth.context_processors.auth‘
  17. verilog异步复位jk触发器_JK触发器(异步复位置位)
  18. 华为发布BB智能观影产品:Vision Glass
  19. GB4793.1试验学习(二)
  20. JavaScript之ECMAScript-正则表达式

热门文章

  1. 【读书笔记】log_archive_dest_n参数描述
  2. Spring Bean的序列化方案
  3. 使用mysqldump进行逻辑备份
  4. Linux 命令(38)—— fdisk 命令
  5. ERROR 126 (HY000) at line 1: Incorrect key file for table '/tmp/#sql_7b09_0.MYI'; try to repair it
  6. netcore 实现一个简单的Grpc 服务端和客户端
  7. 《java入门如此简单》——基础知识1
  8. Oracle SQL Developer 调试存储过程步骤(Oracle)
  9. C/S模型之TCP协议
  10. 快速排序与与冒泡排序效率对比