Java中锁的应用

文章目录

  • 前言
  • 一、场景描述
  • 二、加锁
    • 1.synchronized
    • 2.ReentrantLock
  • 三、扩展
    • 1.ThreadLocal
  • 总结


前言

在多线程场景下,多个线程同时对共享变量进行操作是存在风险的,这时候就需要加锁来保证数据的正确性。


一、场景描述

我这里有5个无人机,准备卖到乌克兰,奈何买家太多了,应酬不来,就挂到了网上,先到先得。

卖方

@Controller
public class StudentLockController {private static int number=5;public boolean get(){String name = Thread.currentThread().getName();if(number>0){try {//模拟业务处理时间Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(name+"业务处理成功");number--;return true;}System.out.println(name+"业务处理失败");return false;}public int size(){return number;}
}

买方

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootStart.class)
public class SpringbootStartTest {@Autowiredprivate StudentLockController studentLockController;@Testpublic void test(){normal();}public void normal(){int count=10;ExecutorService threadPool = Executors.newFixedThreadPool(count);Future<Boolean> submit = null;for(int i=0;i<count;i++){submit = threadPool.submit(() -> studentLockController.get());}try {submit.get();Thread.sleep(1500);} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}System.out.println("数量:"+studentLockController.size());threadPool.shutdown();}
}

来了10个买家,都抢上了,这库存就5个了肯定不够,这样不行,得重新抢,我加个锁让他们排队去
在这里插入图片描述

二、加锁

1.synchronized

public synchronized boolean get(){String name = Thread.currentThread().getName();if(number>0){try {//模拟业务处理时间Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(name+"业务处理成功");number--;return true;}System.out.println(name+"业务处理失败");return false;}

在这里插入图片描述
给这个方法加个锁,但这个锁范围太大了,导致我库存没卖完,这不耽误挣钱了嘛,那哪行,继续改。

2.ReentrantLock

@Controller
public class StudentLockController {private static int number=5;private ReentrantLock rl=new ReentrantLock();public boolean get(){String name = Thread.currentThread().getName();while (!rl.tryLock()){try {//获取锁等待时间Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}};try {if(number>0){//模拟业务处理时间Thread.sleep(1000);System.out.println(name+"业务处理成功");number--;return true;}} catch (Exception e) {throw new RuntimeException(e);}finally {if(rl.isLocked()){rl.unlock();}}System.out.println(name+"业务处理失败");return false;}public int size(){return number;}
}

在这里插入图片描述
嗯,东西都卖出去了,没货了就失败了,这个能挣大钱了,ReentrantLock这个好👍

三、扩展

每个买家购买物品之前需要登陆,一个买家账户会开启一个专门的线程来维护,买家有3次用户名、密码失败的次数,这就需要控制每个线程拥有单独的变量,ThreadLocal可以为每个线程开辟单独的工作空间。

1.ThreadLocal

    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();threadLocal.set(0);Integer count = threadLocal.get();if(count >=3){System.out.println("已经达到最大重试次数,请联系管理员进行重置!");}threadLocal.remove();

总结

回到顶部
加锁是为了保证多线程下数据的安全,但是锁过多和范围过大会影响程序性能,增加服务的处理时间,所以,使用锁要考虑当前的业务场景是否合适。

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

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

相关文章

去除vue自带的边距

使用vue时发现总有去不掉的外边距&#xff0c;在index.vue里面怎样设置样式都不管用 查阅资料后发现要在vue项目自带的index.html文件内添加下面的样式代码才行 <style>*{margin: 0;padding: 0;}body,html{margin: 0;padding: 0;} </style>

代码随想录算法训练营day50 || 57. 爬楼梯,322. 零钱兑换,279.完全平方数

讲解链接&#xff1a; 代码随想录 动态规划之完全背包&#xff0c;装满背包最少的物品件数是多少&#xff1f;| LeetCode&#xff1a;322.零钱兑换_哔哩哔哩_bilibili 动态规划之完全背包&#xff0c;换汤不换药&#xff01;| LeetCode&#xff1a;279.完全平方数_哔哩哔哩_bil…

多表查询

目录 统计出一张数据表中的数据量 查询 dept 表中的数据量 查询 emp 表中的数据量 实现 emp 与 dept 的多表查询 笛卡尔积 消除笛卡尔积 把数据表 emp 的别名定为 e&#xff0c;数据表 dept 的别名定为 d&#xff0c;然后在查询中分别使用 e 和 d 代替这两个表 Oracle从…

【MATLAB】PSO_BP神经网络回归预测(多输入多输出)算法原理

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO-BP神经网络回归预测&#xff08;多输入多输出&#xff09;算法是一种结合粒子群优化算法&#xff08;PSO&#xff09;和反向传播&#xff08;BP&#xff09;神经网络的混合算法。该算…

在小区门口开什么店比较好?把握商机从这里开始

作为一位资深的鲜奶吧创业者&#xff0c;我已经在这个行业摸爬滚打了五年。这五年的时间里&#xff0c;我见证了社区商业的繁荣与变迁&#xff0c;也深刻体会到了在小区门口开店的商机与挑战。今天&#xff0c;我想和大家分享一些关于在小区门口开店的见解&#xff0c;特别是针…

js中正则表达式的详解(应用场景)

文章目录 一、是什么二、匹配规则正则表达式标记贪婪模式懒惰模式分组 三、匹配方法str.match(regexp)str.matchAll(regexp)str.search(regexp)str.replace(regexp)str.split(regexp)regexp.exec(str)regexp.test(str) 四、应用场景参考文献 一、是什么 正则表达式是一种用来匹…

Android 9.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决

1.概述 在9.0的rom定制化开发中,在点击系统自带的播放器以后,播放音乐的时候,在最近任务栏recents列表中,点击全部清除,发现音乐播放器还在播放音乐,导致出现bug,完整的 解决方法,肯定是需要点击全部清除以后,音乐播放器也被杀掉进程,接下来分析下这个移除任务栏流程…

rtt设备io框架面向对象学习-adc设备

目录 1.adc设备基类2.adc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.adc设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的adc.h定义了如下adc设备基类 struct rt_ad…

寒假作业-day11

1>编程实现二维数组的杨辉三角 2>编程实现二维数组计算每一行的和以及列和 3>编程实现二维数计算第二大值 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h>void yanghui(int n){int arr[n][n];for (int i 0; i <…

从零开始实现消息队列(一)

从零开始实现消息队列 .什么是消息队列需求分析核心概念模型 . 什么是消息队列 相信大家都了解过阻塞队列和生产者消费者模型,而阻塞队列最大的用途,就是用于实现生产者消费者模型,生产者消费者模型有以下好处: 解耦合 解释: 当主机A给主机B发消息时,A给B发送请求,B给A返回响应…

app逆向-⽹络请求库Retrofit2

文章目录 一、前言二、POST应用三、GET应用 一、前言 Retrofit2 是基于 OkHttp 构建的 RESTful HTTP 客户端&#xff0c;专门用于简化 HTTP 请求的过程&#xff0c;尤其是用于访问 RESTful API。 Retrofit2 提供了一个声明式的方式来定义 REST API 接口&#xff0c;通过注解来…

【NLP 自然语言处理(一)---词向量】

文章目录 什么是NLP自然语言处理发展历程自然语言处理模型模型能识别单词的方法词向量分词 一个向量vector表示一个词词向量的表示-one-hot多维词嵌入word embeding词向量的训练方法 CBOW Skip-gram词嵌入的理论依据 一个vector&#xff08;向量&#xff09;表示短语或者文章ve…

P1990 覆盖墙壁题解

题目 有一个长为N宽为2的墙壁&#xff0c;给你两种砖头&#xff1a;一个长2宽1&#xff0c;另一个是L型覆盖3个单元的砖头。如下图&#xff1a; 0 0 0 00砖头可以旋转&#xff0c;两种砖头可以无限制提供。你的任务是计算用这两种来覆盖N2的墙壁的覆盖方法。例如一个23的墙…

13种2023年智能算法进行PK,免费获取matlab代码

本期推出13种2023年智能算法进行PK&#xff0c;在CEC2005和CEC2022函数集进行测试。文末有代码获取方式。 13种算法都是2023年提出的&#xff0c;分别为&#xff1a; 淘金优化器(GRO)&#xff0c;雪消融优化器(SAO)&#xff0c;霜冰优化算法(RIME)&#xff0c;减法优化器(SABO)…

C++-添加Com类-从 ActiveX 控件添加类-从类型库添加类向导

文章目录 1.从类型库添加类向导2.从 ActiveX 控件添加类3.总结1.从类型库添加类向导 在Visual Studio等开发环境中,从类型库添加类向导是一个用于自动生成接口实现代码的功能。它可以帮助开发者根据COM(Component Object Model)类型库中的接口定义生成对应的类,极大地提高…

最通俗易懂的讲解——STP专题(BPDU选举机制)

点赞关注&#xff0c;持续更新STP专题&#xff01;&#xff01;&#xff01; BPDU选举机制 BPDU通过4个参数进行选举&#xff1a; RID&#xff1a;根桥的BID&#xff1b;RPC&#xff1a;对于根桥来说RPC永远等于0&#xff0c;对于非根桥来说RPC是自己的根端口到根桥的路径开…

easyx搭建项目-永七大作战(割草游戏)

永七大作战 游戏介绍&#xff1a; 永七大作战 游戏代码链接&#xff1a;永七大作战 提取码&#xff1a;ABCD 不想水文了&#xff0c;直接献出源码&#xff0c;表示我的诚意

(三十七)大数据实战——Solr服务的部署安装

前言 Solr是一个基于Apache Lucene的开源搜索平台&#xff0c;它提供了强大的全文搜索、分布式搜索和数据分析功能。Solr 可以用于构建高性能的搜索应用程序&#xff0c;支持从海量数据中快速检索和分析信息。Solr 使用倒排索引和先进的搜索算法&#xff0c;可实现快速而准确的…

计算机组成原理:存储系统【一】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;计算机组成与原理基础 1 主存的模型、寻址1.1 总览1.2 存储器的层次化结构1.3 存储器的分类1.3.1 按层次1.3.2 按照介质1.3.3 按照访问方式1.3.4 按照信息的可更改性1.3.5 按照信息的可保存…

28.Stream流

Stream流 1. 概述2. 方法2.1 开始生成方法2.1.1 概述2.1.2 方法2.1.3 代码示例 2.2 中间操作方法2.2.1 概述2.2.2 方法2.2.3 代码示例 2.3 终结操作方法2.3.1 概述2.3.2 方法2.3.3 代码示例 2.4 收集操作方法2.4.1 概述2.4.2 方法2.4.3 代码示例 3. 代码示例14. 代码示例25. 代…