JAVA 同步锁

news2024/12/28 11:41:21

文章目录

  • synchronized
    • synchronized 作用当前对象
    • synchronized 作用订单号条件
    • synchronized 作用订单号字符串条件
  • ReentrantLock 加 ConcurrentHashMap

需求: 同一个订单才加同步锁,不同订单可并行

synchronized

synchronized是Java中的关键字,是一种同步锁,是原生语法层面的互斥,需要jvm实现。它修饰的对象有以下几种:
  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

synchronized 作用当前对象

在这里插入图片描述
测试效果:
一)线程1 与 线程2 ,结果 线程1结束了线程2才开始。
在这里插入图片描述

synchronized 作用订单号条件

在这里插入图片描述
测试效果:
一)线程1 与 线程2 ,结果 线程1线程2可以同时开始。
在这里插入图片描述
二)线程1 与 线程1 ,结果 线程1与另一个线程1同时开始
synchronized 的锁不是比较字符串,而是对象,所以每次请求进来的orderId不是同一个对象。
在这里插入图片描述

synchronized 作用订单号字符串条件

把 synchronized 锁的 orderId 放在常量池中,那每次请求进来的就是同一个对象。
在这里插入图片描述
测试效果:
一)线程1 与 线程1 ,结果 线程1线程1锁住了。
在这里插入图片描述
二)线程1 与 线程2,结果 线程1与线程2同时开始。
在这里插入图片描述

ReentrantLock 加 ConcurrentHashMap

ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成

------------------------------------------------controller
@RestController
 public class OrderController{
 	@Autowired
 	SynchronizedByKey synchronizedByKey;

	@ResponseBody
	@RequestMapping("")
	pubilc Map<String,Object> process(@PathVariable("orderId")String orderId){
		SynchronizedByKey.exec(orderId,() ->{
			logger.debug("[{}] 开始",orderId);
			logger.debug("[{}] 结束",orderId);
		});
	}
}

------------------------------------------------SynchronizedByKey 
public class SynchronizedByKey {
	Map<String,ReentrantLock>  mutexCache = new ConcurrentHashMap<>;
	
	public void exec(String key,Runnable statement){
		ReentrantLock mutex4Key = null;
		ReentrantLock mutexInCache;
		do{
			if(mutex4Key != null){
				mutex4Key.unlock();
			}
			mutex4Key  = mutexCache.computeIfAbsent(key, k -> new ReentrantLock());
			mutex4Key.lock();
			/* lock()后再根据key去mutexCache取一把锁(mutexInCache),
				极端情况:
				1.我刚刚拿到了这把锁(mutexInCache),又从map里取的时候它为空了,说明我刚刚拿到的那么锁被remove掉了;
				2.我刚刚拿到了这把锁(mutexInCache),被新进来的线程(都是001)又创建了一把新锁覆盖了,
					所以mutex4Key 和 mutexInCache 不等; */
			mutexInCache = mutexCache.get(key);
		} while(mutexInCache == null || mutex4Key != mutexInCache);
		
		try{
			statement.run();
		} finally{
			if(mutex4Key.getQueueLength() == 0){
				mutexCache.remove(key);
			}
			mutex4Key.unlock();
		}
		
	}
}

学习视频链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192799.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python--飞机大战(课程设计)

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

【halcon学习-读图像和遍历文件下图像】

halcon学习-读图像和遍历文件下图像1.读取单张图像2.读取多张选定图片3.读取文件目录下所有的图片1.读取单张图像 与很多图像处理读图算子一样&#xff0c;halcon里读取单张图片的操作很简单&#xff1a; read_image(test1, D:/myfile/作业/拉链检测/chain1.bmp)也可以使用Ct…

【数据结构与算法】LRU Cache

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

2023年房地产融资模式研究报告

第一章 概况 融资&#xff0c;英文为 Financing&#xff0c;指为支付超过现金或转账的购货款而采取的货币交易手段&#xff0c;或者为取得特定资产而筹集资金所采取的货币手段。融资通常指货币资金的特有者和需求者之间&#xff0c;直接或间接地进行资金融通的活动。 广义的融…

【操作系统】多线程与多进程通信之深入理解【2023.01.31】

基本概念 首先&#xff0c;假设这么一个场景&#xff0c;进程A有线程Thread_A1和线程Thread_A2&#xff0c;进程B有线程Thread_B1和Thread_B2。举个例子&#xff0c;系统中进程的内存是独立的&#xff0c;也就是一台内存为4G的计算机&#xff0c;除了系统占用的1G部分&#xf…

Oracle——分析函数

文章目录前言介绍demo案例测试测试前的准备rank()dense_rank()row_number()前言 分析函数在oracle中比较常见&#xff0c;但用的不多&#xff0c;今天有幸碰见&#xff0c;索性做一次使用的总结说明。 介绍 oracle中的分析函数&#xff0c;常见的有下面的三种&#xff1a; r…

四季度亏损扩大,Meta Reality Labs近4年财报营收汇总

2月2日青亭网报道&#xff0c;Meta今天发布了2022财年第四季度财报、全年财报。根据22年四季度财报信息显示&#xff0c;Reality Labs业务部门营收营收7.27亿美元&#xff0c;同比&#xff08;21年四季度8.77亿美元&#xff09;要下降17.1%&#xff1b;净亏损42.79亿美元&#…

R语言多元数据统计分析在生态环境中的应用

生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate statistical analysis&#xff09;。多元统计分析内容丰富&#xff0c;应用广泛&#xff0c;是非常重要和…

关于java中的BigInteger

文章目录关于BigInteger类BigInteger的构造方法BigInteger方法使用示例算术运算API转换为基本数据类型的方法小结关于BigInteger类 BigInteger类是用于解决整型类型&#xff08;含基本数据类型及对应的包装类&#xff09;无法表示特别大的数组及运算问题。 即使是占用字节数最…

HTB_Weak RSA

文章目录信息收集RSA 算法题目解密信息收集 下载&#xff0c;解压 (密码都是hackthebox) enc后缀的文件是一种加密文件&#xff0c;打开为乱码&#xff0c;key.pub内容如下&#xff0c;是 RSA 加密算法的公钥 -----BEGIN PUBLIC KEY----- MIIBHzANBgkqhkiG9w0BAQEFAAOCAQwAMI…

CISP信息安全认证考试都考什么?

CISP考试是目前热门的信息安全认证考试&#xff0c;很多刚刚开始了解CISP的朋友&#xff0c;比较关心关于CISP考试内容的相关问题&#xff0c;今天就由中培小编带大家一起去看看CISP认证考试究竟都考哪些内容&#xff1f;首先来看一下试卷结构考试时间&#xff1a;120分钟考试题…

CSS图标与链接

目录 如何添加图标 Font Awesome 图标 实例 Bootstrap 图标 实例 Google 图标 实例 为图标添加样式或颜色 设置链接样式 实例 实例 文本装饰 实例 背景色 实例 链接按钮 实例 更多实例 如何添加图标 向 HTML 页面添加图标的最简单方法是使用图标库&#xff0…

【Less】全局样式重复注入问题

// package.json {"less": "^4.1.3","vite": "^3.1.0", }参考&#xff1a; [less/sass]如何避免因公共模块导致生成重复css代码解决 Vue CSS 样式重复载入&#xff0c;为 Vue 添加全局 less 或 sass 基础样式库【不是本篇解决方法&am…

vue3学习笔记之router(router4 + ts)

文章目录Vue Router1. 基本使用router-view2. 路由跳转2.1 router-link2.2 编程式导航2.3 replace3. 路由传参4. 嵌套路由5. 命令视图6. 重定向和别名6.1 重定向6.2 别名7. 路由守卫7.1 全局前置守卫7.2 全局后置守卫案例&#xff1a;加载滚动条8. 路由元信息9. 路由过渡动效10…

瞧不上alert 老古董?使用alert实现一个精美的弹窗

曾几何时alert陪伴了我很多歌日日夜夜&#xff0c;但现在人们越来越追求高端的技术&#xff0c;其实慢慢的我也都快淡忘了前端的世界里还有alert这么一个伟大的成员。 目录 一、为什么抛弃了alert? 1. 不同浏览器的表现 2. 第三方组件的使用 3. 代码意识的控制 二、用al…

2023年浏览器哪个好用速度快,看这一篇就够了

在网络覆盖的社会&#xff0c;不管走到哪里&#xff0c;都能上网浏览新闻、看热点资讯。浏览器是用户上网浏览的必要软件之一&#xff0c;它决定这用户浏览网页的速度和习惯。那么&#xff0c;2023年什么浏览器好用稳定速度快&#xff1f;目前优秀的浏览器有很多&#xff0c;但…

HDFS常用命令汇总

HDFS常用命令汇总一、前言信息二、帮助信息查看1、查看帮助信息2、帮助文档&#xff08;附带命令的详细说明&#xff09;三、常用命令1、创建目录2、查看目录下的内容3、上传文件4、上传并删除源文件5、查看文件内容6、查看文件开头内容7、查看文件末尾内容8、下载文件9、合并下…

ceph中报错“ clock skew detected on mon.ceph2, mon.ceph3”

自己搭建的ceph集群&#xff0c;显示时间不同步:clock skew detected on mon.ceph2, mon.ceph3但是查看chrony进程已经启动&#xff0c;ceph配置文件中,如下参数也已经配置&#xff0c;查看chrony.conf配置文件发现&#xff0c;同步源没有修改过&#xff0c;默认的于是修改ceph…

面试官的几句话,差点让我挂在HTTPS上

面试官的几句话&#xff0c;差点让我挂在HTTPS上 目录&#xff1a;导读 一、HTTP 协议 二、HTTPS 协议 三、使用 HTTP 协议还是 HTTPS 协议呢&#xff1f; 四、HTTP 协议和 HTTPS 协议的区别 作为软件测试&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握…

MySQL jdbc 反序列化分析

0x01 前言听师傅们说这条链子用的比较广泛&#xff0c;所以最近学一学&#xff0c;本来是想配合着 tabby 或是 codeql 一起看的&#xff0c;但是 tabby 的环境搭建一直有问题&#xff0c;耽误了很久时间&#xff0c;所以就直接看了0x02 JDBC 的基础• 本来不太想写这点基础的&a…