synchronized可重入锁
什么是可重入锁?它有什么作用?
可重入锁,也叫做递归锁,指的是在同一线程内,外层函数获得锁之后,内层递归函数仍然可以获取到该锁。
说白了就是同一个线程再次进入同样代码时,可以再次拿到该锁。
它的作用是:防止在同一线程中多次获取锁而导致死锁发生。
在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可重入锁相关推荐
- 多线程复习总结之解析Synchronized与重入锁
引言 在Java里面,最基本的互斥同步手段就是synchronized关键字,常被人成为重量级锁,这是一种块结构(Block Structured)的同步语法.synchronized是Java语言中 ...
- Java面试之锁-可重入锁和递归锁
可重入锁和递归锁ReentrantLock 概念 可重入锁就是递归锁 指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码. 在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取 ...
- 到底什么是重入锁,拜托,一次搞清楚!
相信大家在工作或者面试过程中经常听到重入锁这个概念,或者与关键字 synchrozied 的对比,栈长面试了这么多人,80%的面试者都没有答对或没有答到点上,或者把双重效验锁搞混了,哭笑不得.. 那么 ...
- 可重入锁和不可重入锁详解
目录 概念: 通俗理解: 可重入锁的工作原理: ReenTrantLock可重入锁和synchronized的区别: ReentrantLock源码分析: 可重入锁代码演示: 概念: Reentran ...
- 可重入锁 介绍以及原理
可重入锁介绍 首先,在Synchronized和ReentrantLock的区别中,我们介绍了两者都是可重入锁,那么究竟什么是可重入锁呢?其内部原理又是如何实现的呢? 概念:可重入锁意味着:若一个程序 ...
- JUC - 多线程之悲观锁、乐观锁,读写锁(共享锁、独享锁),公平非公平锁,可重入锁,自旋锁,死锁(十)
Java中主要有如下锁 一.悲观锁.乐观锁 悲观锁:当前线程去操作数据的时候,总是认为别的线程会去修改数据,所以每次操作数据的时候都会上锁,别的线程去操作数据的时候就会阻塞,比如synchronize ...
- synchronized 与 Reentrant均为可重入锁 区别后者比前者增加了长时等待可中断 设置是否公平锁 绑定多个条件
① 两者都是可重入锁 两者都是可重入锁."可重入锁"概念是:自己可以再次获取自己的内部锁.比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时 ...
- 【并发编程】线程锁--Synchronized、ReentrantLock(可重入锁)
在说锁之前,我们要明白为什么要加锁,不加锁会怎样? 在并发编程中,很容易出现线程安全问题,接下来我们看个很经典的例子--银行取钱,来看一下有关线程安全的问题. 取钱的流程可以分为一下几个步骤: 1.用 ...
- ReenTrantLock可重入锁(和synchronized的区别)总结
ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...
最新文章
- 怎么修改php.in的时间,melongin怎么设置
- 在windows下将Tomcat设置为自动启动的服务
- BIM+GIS应用实战(听课笔记)
- 如何对用户进行细分-邮件营销中用户细分的方法
- 硬件芯片选型原理图设计
- 应用zip压缩的javascript以及Egret H5游戏实战
- 项目部署时,linux环境配置问题
- c++解释--百度百科
- mysql事件关闭解决办法
- 网络安全实验7 防火墙 Iptables应用
- 入选互联网名人堂的三位中国人
- vue 前端打印pdf
- bugkuCTF—杂项—旋转跳跃
- 软件测试报告编写指南
- qwebkit的套壳开发
- django报错ERRORS:?: (admin.E402) ‘django.contrib.auth.context_processors.auth‘
- verilog异步复位jk触发器_JK触发器(异步复位置位)
- 华为发布BB智能观影产品:Vision Glass
- GB4793.1试验学习(二)
- JavaScript之ECMAScript-正则表达式
热门文章
- 【读书笔记】log_archive_dest_n参数描述
- Spring Bean的序列化方案
- 使用mysqldump进行逻辑备份
- Linux 命令(38)—— fdisk 命令
- ERROR 126 (HY000) at line 1: Incorrect key file for table '/tmp/#sql_7b09_0.MYI'; try to repair it
- netcore 实现一个简单的Grpc 服务端和客户端
- 《java入门如此简单》——基础知识1
- Oracle SQL Developer 调试存储过程步骤(Oracle)
- C/S模型之TCP协议
- 快速排序与与冒泡排序效率对比