当前位置: 首页 > news >正文

【线程安全】ReentrantLock和synchronized的使用示例——言简意赅

三个进货员 分别进货 500000次、50000、50000次,一共应该进来600000箱; * 笔记:如何编写企业级的多线程代码 *
固定的变成套路+模板是什么?

不加synchronized、ReentrantLock每次都会导致不一样的结果
在这里插入图片描述
结果:
第一次运行
在这里插入图片描述
第二次运行
在这里插入图片描述

这就是线程不安全现象;

synchronized实现: 其中应用到了Lambda表达式,表达式未简化之前样式可见上面注释代码

package com.atguigu.signcenter.util;import java.util.concurrent.locks.ReentrantLock;/*** 题目:三个进货员 分别进货 500000次、50000、50000次,一共应该进来600000箱;* 笔记:如何编写企业级的多线程代码* 固定的变成套路+模板是什么?* 1. 在高内聚低耦合的前提下,线程   操作(资源类对外暴露的调用方法)  资源类* 1.1 一言不合,先创建一个资源类*/
public class SaleTicketDemo {public static void main(String[] args) {  // 主线程,一切程序的入口Ticket ticket = new Ticket();// Thread(Runnable target, String name)// 使用匿名内部类/* new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员1").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员2").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员3").start();*/// 使用lambda表达式new Thread(() -> {for (int i = 1; i <= 500000; i++) ticket.saleTicket();}, "进货员1").start();new Thread(() -> {for (int i = 1; i <= 50000; i++) ticket.saleTicket();}, "进货员2").start();new Thread(() -> {for (int i = 1; i <= 50000; i++) ticket.saleTicket();}, "进货员3").start();}}class Ticket {  // 资源类private int number = 0;private ReentrantLock lock = new ReentrantLock();  // 可重入锁public synchronized void saleTicket() {try {if (number >= 0) {number++;System.out.println("进货员进一箱水果,目前一共 = " + number);}} finally {}}}

运行结果:
在这里插入图片描述

ReentrantLock使用

package com.atguigu.signcenter.util;import java.util.concurrent.locks.ReentrantLock;/*** 题目:三个进货员 分别进货 500000次、50000、50000次,一共应该进来600000箱;* 笔记:如何编写企业级的多线程代码* 固定的变成套路+模板是什么?* 1. 在高内聚低耦合的前提下,线程   操作(资源类对外暴露的调用方法)  资源类* 1.1 一言不合,先创建一个资源类*/
public class SaleTicketDemo {public static void main(String[] args) {  // 主线程,一切程序的入口Ticket ticket = new Ticket();// Thread(Runnable target, String name)// 使用匿名内部类/* new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员1").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员2").start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 40; i++) {ticket.saleTicket();}}}, "售票员3").start();*/// 使用lambda表达式new Thread(() -> {for (int i = 1; i <= 500000; i++) ticket.saleTicket();}, "进货员1").start();new Thread(() -> {for (int i = 1; i <= 50000; i++) ticket.saleTicket();}, "进货员2").start();new Thread(() -> {for (int i = 1; i <= 50000; i++) ticket.saleTicket();}, "进货员3").start();}}class Ticket {  // 资源类private int number = 0;private ReentrantLock lock = new ReentrantLock();  // 可重入锁//     public synchronized void saleTicket() {public void saleTicket() {lock.lock();try {if (number >= 0) {number++;System.out.println("进货员进一箱水果,目前一共 = " + number);}} finally {lock.unlock();}}}

运行结果:
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【嵌入式开发之网络编程】TCP并发实现
  • 主场竞争,安踏把背影留给耐克
  • Java13 网络编程
  • 【pytorch】固定(freeze)住部分网络
  • MyBatis一级缓存和二级缓存以及 mybatis架构
  • 五指生望京新店开业,开启健康之旅
  • 用AppleScript做macOS UI自动化
  • 外卖系统开发:如何打造一个无缝衔接的用户体验?
  • 建模模型时间说明
  • GPT应用篇:如何用GPT4.0写一本言情小说?
  • atsec出席2024 PCI社区会议
  • 什么软件可以约束员工摸鱼行为?黑神话悟空爆火!上班玩游戏,职场新利器来啦
  • 目标 CDC实例数据库更改密码,预定启动报错SQL 错误代码为“-30082”。SQL 状态为:08001。
  • Haporxy搭建web集群
  • docker 数据存储
  • Android交互
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Codepen 每日精选(2018-3-25)
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • HTTP--网络协议分层,http历史(二)
  • input的行数自动增减
  • leetcode386. Lexicographical Numbers
  • Mybatis初体验
  • PHP变量
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • webpack4 一点通
  • 关于springcloud Gateway中的限流
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 运行时添加log4j2的appender
  • C# - 为值类型重定义相等性
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​2021半年盘点,不想你错过的重磅新书
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (七)Flink Watermark
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十七)Flink 容错机制
  • (算法)硬币问题
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • ***通过什么方式***网吧
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NetCore项目nginx发布
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • //TODO 注释的作用
  • /bin/bash^M: bad interpreter: No such file ordirectory