线程同步(卖票案例)
1 卖票【应用】
- 案例需求
某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 - 实现步骤
- 在类中重写run()方法实现卖票,代码步骤如下
- 判断票数大于0,就卖票,并告知是哪个窗口卖的
- 卖了票之后,总票数要减1
- 票卖没了,线程停止
synchronized
synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁
- 同步的好处和弊端
- 好处:解决了多线程的数据安全问题
- 弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
- 代码演示
package Thread.MyThread;/**synchronized 是隐式锁,出了作用域自动释放。* */ public class MyThread_synchronized implements Runnable{//由于买票的数为固定private int trick=100;@Overridepublic void run() {//定义循环while (true){synchronized (this){//synchronized ()中不能直接传数据名称//this表示当前数据if(trick>0){//使线程休眠100毫秒,millis自定义try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}//打印票的张数System.out.println("当前"+Thread.currentThread().getName()+"正在销售第:"+trick+"张票");//每执行一次减一张票trick--;}else {break;}}}}public static void main(String[] args) {MyThread_synchronized my = new MyThread_synchronized();Thread t1 = new Thread(my,"窗口1");Thread t2 = new Thread(my,"窗口2");Thread t3 = new Thread(my,"窗口3");Thread t4 = new Thread(my,"窗口4");Thread t5 = new Thread(my,"窗口5");//执行线程t1.start();t2.start();t3.start();t4.start();t5.start();} }
Lock锁【应用】
虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
- ReentrantLock构造方法
方法名
说明
ReentrantLock()
创建一个ReentrantLock的实例
- 加锁解锁方法
方法名
说明
void lock()
获得锁
void unlock()
释放锁
- 代码演示
package Thread.MyThread;import java.util.concurrent.locks.ReentrantLock;public class MyThread_Lock implements Runnable{//由于买票的数为固定private int trick=100;//创建
线程同步(卖票案例)相关推荐
- Java线程安全(卖票案例) 如何解决线程安全(synchronized ,显示锁Lock)
文章目录 线程安全 解决方法: 1.同步代码块 2.同步方法 3.显示锁 显示锁与隐式锁的区别 4.公平锁与非公平锁 线程安全 经典问题:卖票问题,多个线程一起执行该任务,当余票只有1一张时,三个线程 ...
- JAVA培训—线程同步--卖票问题
线程同步方法: (1).同步代码块,格式: synchronized (同步对象){ //同步代码 } (2).同步方法,格式: 在方法前加synchronized修饰 问题: 多个人同时买票. 1. ...
- 多线程:线程同步与死锁(卖票案例)、线程通信、生产者与消费者
卖票案例 5个窗口同时卖票: 使用Runnable接口,只创建了一个ticket1对象,5个线程共享此对象,实现了资源共享. public class ticket1 implements Runna ...
- java多线程,卖票案例
目录 卖票案例 测试代码 代码1 代码2,卖票问题的思考 代码3 代码4 代码5 卖票案例 测试代码 package com.itheima_06;/*需求:某电影院目前正在上映国产大片,共有100张 ...
- 卖票案例 多线程 java 1615387415
卖票案例 多线程 java 1615387415 解决 线程类 测试类 注意,需要给线程的类添加带参构造方法 在带参构造方法中 调一下父类的带参构造方法 最终结果 每个窗口都卖了一百张票
- Java多线程(卖票案例)
1.卖票案例需求分析 某天某个景区售票,门票票只有100张,景区有三个售票窗口,同时售票,共享票源(100张) 通过多线程的方式实现三个售票窗口同时售票 首先要明确票源只能有一个 其次需要创建三个Th ...
- java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...
学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...
- 线程安全问题经典案例---卖票
在入门多线程的时候,看到过不少的案例,其中卖票案例尤为经典,在这里自己也记录一下,同时加深对于线程安全的理解: 案例场景 情景一: 现在有一个电影院,马上要上映电影<战狼5>,电 ...
- Java20-day11【实现多线程(进程、线程-调度-控制-生命周期)、线程同步(同步代码块、线程安全、Lock)、生产者消费者(模式概述、案例)】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
最新文章
- 关于Nikon Ai AF 28mm F1.4D遮光罩的问题
- 基于Kubernetes的云平台存储容器化实践
- [LeetCode] Longest Palindromic Substring
- Flutter开发之HTTP网络请求:dio库(28)
- mysql数据库安装教程32位,看这一篇就够了!
- python中的__slots__
- 每一个都能笑抽,39个奇葩代码注释
- 安装配置mac版_全面战争三国 Mac版Mod安装指南
- Mac OS X 上搭建 Hadoop 开发环境指南
- pyQT指定窗口截图
- idea下载源代码报错提示Connection refused to host: 127.0.0.1;
- 【转载】C++操作符的优先级
- 经典C语言编程100例——题目+答案代码(完结)
- hibernate无法自动建表:ERROR: HHH000388
- LeetCode(数据库)- 计算税后工资
- C fork introduce
- ORA-31655,ORA-39154 Objects from foreign schemas have been removed from import
- win7如何看计算机几核,win7系统查看CPU是几核的操作方法
- 人类和海洋动物的相似之处
- 修改gif图片文件大小
热门文章
- java 时间片_Java 实现--时间片轮转 RR 进程调度算法
- 设计模式之蛋糕店结账系统
- 完美时尚源于不断创新---男士护肤的误区
- python爬虫 ip代理_Python 爬虫入门(二)—— IP代理使用
- 神书护体,开学大吉——计算机专业必读的10本畅销经典
- IDEA修改maven的JVM启动内存参数
- 共享锁和独占锁简单介绍
- 【华为OD机试 2023】 字符串解密(C++ Java JavaScript Python)
- 对jupyter notebook运行时出现“The kernel appears to have died. It will restart automatically”的解决方案
- Mybatis缓存 自定义缓存
- Java线程安全(卖票案例) 如何解决线程安全(synchronized ,显示锁Lock)