当前位置: 首页 > 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();}}}

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


http://www.mrgr.cn/news/11668.html

相关文章:

  • [论文笔记] megatron 大模型超参搜索pipeline
  • 博弈论详解 2(SG函数 和 SG定理)
  • 【负载均衡式在线OJ】oj_server模块
  • DNS详解
  • 国际业务产品系统应用架构设计
  • 零工市场小程序应该有什么功能?
  • 没有大海也能冲浪-带你学习尾波冲浪
  • 打卡学习Python爬虫第五天|使用Xpath爬取豆瓣电影评分
  • 流媒体协议分析
  • npm install报错解决记录
  • MySQL空间管理:查询、优化与碎片清理
  • 毕 业 设 计(论 文)远程接入企业网络规划与设计
  • 【Docker】安装Docker环境遇到的坑(VirtualBox)
  • 设计模式之简单工厂模式
  • npm镜像源报错 unexpected token >
  • zotero同步之infiniteCLOUD网盘 WebDAV
  • vue3组件封装系列-表格及分页-第二弹
  • word文档合并样式问题
  • 国产游戏行不行,主要还得“盘”商业模式!
  • 【Docker】Linux系统以及威联通QNAP部署思源笔记的通用教程