Lock锁实现多线程卖票

理解多线程卖票demo

    • Lock架构
    • 使用lock替代synchronized
    • 总结

使用Lock 实现。

Lock架构

使用lock替代synchronized

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 企业级的多线程代码* 在高内聚低耦合情况下 多线程 操作 资源类* @author echo lovely* @date 2021/2/15 13:08*/class Ticket {private int num = 30;// 创建锁Lock lock = new ReentrantLock();void sale() {lock.lock();try {if (this.num > 0)System.out.println(Thread.currentThread().getName() + " 当前票数: " + this.num -- + "\t还剩下票数: " + num);} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}public class Demo01 {public static void main(String[] args) {// 开启三个线程同时卖票Ticket ticket = new Ticket();new Thread(() -> {for (int i = 0; i < 30; i++) {ticket.sale();}} , "A").start();new Thread(() -> {for (int i = 0; i < 30; i++) {ticket.sale();}} , "B").start();new Thread(() -> {for (int i = 0; i < 30; i++) {ticket.sale();}} , "C").start();}}

总结

模板代码:


try {lock.lock();// todo sth...} catch (Exception e) {e.printStackTrace();
} finally {// 释放资源lock.unlock();
}

使用Thread类创建线程套路写法:

new Thread(Runnable r, String threadName);// lambda替代了Runnable接口中的 run方法
new Thread(() -> { // 线程业务方法 }, "your thread name...");

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

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

相关文章

小程序引入的echarts过大如何解决_解决生鲜行业“获客难”的难题,教你如何妙用小程序...

近年来&#xff0c;随着生鲜食品产业的快速发展&#xff0c;大量企业和商家加入了生鲜食品的“大本营”。但大量的企业和商家也对市场产生了一定的影响&#xff0c;不少生鲜商家陷入了一个困境——难以获得客户。当生鲜食品企业面临“获客难”的困境时&#xff0c;不妨开发一个…

前端学习(1319):node.js异步编程

test,js function getMsg(callback) {setTimeout(function() {callback({msg: hello node js})}, 2000) } getMsg(function(data) {console.log(data); }); callback.js function getData(callback) {callback(123); } getData(function(n) {console.log(被调用了);console.…

docker web程序本地化_Docker-01-Docker介绍

一 什么是虚拟化在计算机中&#xff0c;虚拟化&#xff08;Virtualization&#xff09;是一种资源管理技术&#xff0c;是计算机的各种实体资源&#xff0c;如服务器&#xff0c;网络&#xff0c;内存及存储等&#xff0c;予以抽象&#xff0c;转换后呈现出来&#xff0c;打破实…

tk-mapper 生成器

tk-mapper生成代码代码&#xff0c;项目地址如何使用1. 生成实体类, XML文件, Mapper接口。 2. 版本相关&#xff1a;mapper&#xff1a; 3.4.1mapper-spring-boot-starter: 1.1.2mybatis-generator-core: 1.3.6 3. 这里以SpringBoot为demo, 作为一个程序&#xff0c;运行Gener…

前端学习(1321):node.js得异步api

const fs require(fs);fs.readFile(./1.txt, utf8, (err, result1) > {console.log(result1);fs.readFile(./2.txt, utf8, (err, result2) > {console.log(result2);fs.readFile(./3.txt, utf8, (err, result3) > {console.log(result3);});}); }) 运行结果

面向接口编程的优点_为什么我们要面向接口编程

到底面向&#xff1f;编程面向过程编程( ProcedureOriented、简称 PO) 和 面向对象编程( ObjectOriented、简称 OO) 我们一定听过&#xff0c;然而实际企业级开发里受用更多的一种编程思想那就是&#xff1a;面向接口编程( Interface-Oriented)&#xff01;接口这个概念我们一定…

Android数据库LitePal的存储操作

本文属于转载&#xff0c;在此声明&#xff0c;出处&#xff1a;http://blog.csdn.net/guolin_blog/article/details/38556989 并且感谢guolin分享了这么精彩的博文。以下正文&#xff1a; 经过前面几篇文章的学习&#xff0c;我们已经把LitePal的表管理模块的功能都很好地掌握…

程控电源测试微安电流模式_无缝隙源和负载的切换:双向程控电源的一大门槛...

目前采用电池供电的直流无刷电机驱动的设备越来越多&#xff0c;从电动工具&#xff0c;无人机、机器人、再到电动汽车等。然而电机驱动器和电池的管理始终是研发工程师不得不面对的一道难题。电动机利用的是“电生磁”原理&#xff0c;把电能转换成机械能。但制动&#xff0c;…

前端学习(1324):anysc关键字

//只能出现再异步函数中 暂停异步函数得执行 async function fn() {throw 发生勒一些错误;return 123; } //console.log(fn()) fn().then(function(data) {console.log(data); }).catch(function(err) {console.log(err); }) 运行结果

Pacman主题下给Hexo增加简历类型

原文 http://blog.zanlabs.com/2015/01/02/add-resume-type-to-hexo-under-pacman-theme/ 背景 虽然暂时不找工作&#xff0c;但是想着简历也是个向别人推销自己的好东西。然后也想着折腾点新的东西&#xff0c;如此&#xff0c;这般&#xff0c;便想着研究起写个简历了。形式不…

屏幕输出语句_C语言快速入门——表达式与语句

表达式表达式是由运算符和操作数组合构造成。最简单的表达式是一个单独的操作数&#xff0c;以此作为基础&#xff0c;结合语言自身支持的操作符&#xff0c;就可以建立复杂的表达式。下面是一些表达式&#xff1a;从这里可以看到&#xff0c;操作数可以是数据常量(4&#xff0…

前端学习(1325):await关键字

async function p1() {return p1; } async function p2() {return p2; } async function p3() {return p3; } async function run() {let r1 await p1();let r2 await p2();let r3 await p3();console.log(r1);console.log(r2);console.log(r3);} run(); 运行结果

接口测试客户端的搭建

一. 引言 随着公司项目整体架构由原来的多渠道各自为战&#xff0c;向着建立统一的服务端应用&#xff0c;从而为各渠道提供服务调用的转变&#xff0c;服务端应用接口测试成了我们日常工作中的重要任务之一。经过半年的摸索和项目实战&#xff0c;我们已经掌握了一套接口测试的…

前端学习(1327):node全局对象global

global.console.log(我是歌谣); global.setTimeout(function() {console.log(123); }, 2000) 运行结果

C#秘密武器之反射——基础篇

先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator { public class Arithmetic:Iwel { /// <summary> /// 没有带参数的构造函数 /// </summary> public Arithmetic() {} public Arithmetic(i…

Python3 etree, requests库抓取bt

bt种子抓取1. 抓取你想要的数据2. 爬取bt种子3. 抓取磁力链迷上了追番.. . bt种子xunlei来解决。 推荐一个网站https://mikanani.me。可以搜索你想要的动漫… 以bt的形式下载&#xff0c;或者复制磁力链。 1. 抓取你想要的数据 需要了解requests, etree库&#xff0c;etree用…