java多线程之线程安全----铁路售票系统的实现
案例:
铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果
窗口001正在销售第1000张票
窗口001正在销售第999张票
窗口002正在销售第998张票
.。。。
窗口05正在销售第1张票
票已经销售完毕
下面我们就此系统进行一个简单的分析:
代码编写可能会出现的问题及解决案:
出现部分重票-------原因:每个线程都有可能去执行打印总票数
解决方案:加锁确保线程安全,注意锁的范围,锁的对象代码执行出现负数--------原因:多个线程都进入循环的判断,在锁外等待
解决方案:在锁内增加判断
注意:每个线程执行完都要退出
需要导入的包为
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
以下是三个方法的实现
class Task implements Runnable {private int ticket =1000;private Object obj=new Object(); //成员属性------synchronized (obj)需使用,其他方法可无视private Lock lock=new ReentrantLock(); //实例化互斥对象锁-------方法3需使用,其他方法可无视@Overridepublic void run() {
/* //方式2:同步方法while(true) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}if (!this.sava2()) {break;}}
*///-----------------------------------完美分割符-----------------------------------------//方式3:互斥对象锁---容易死锁 //1.同一个锁 2.锁的范围while (true) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}try {lock.lock(); //加锁if (ticket>0) {System.out.println(Thread.currentThread().getName()+"正在销售第"+ticket+"票");ticket--;}else {System.out.println(Thread.currentThread().getName()+"票已售完");break;}}finally {lock.unlock(); //释放锁}}}//-----------------------------------完美分割符-----------------------------------------//方式2:同步方法---1.同一个锁对象 2.锁的范围private synchronized boolean sava2() {if (ticket>0) {System.out.println(Thread.currentThread().getName()+"正在销售第"+ticket+"票");ticket--;return true;}else {System.out.println(Thread.currentThread().getName()+"票已售完");return false;}}//-----------------------------------完美分割符-----------------------------------------//方式1:同步代码块private void save1() {while(true) {try {Thread.sleep(3); //睡眠3毫秒---复现问题和复现抢占资源效果} catch (InterruptedException e) {e.printStackTrace();}synchronized (this) { //这里使用 this "lock" obj ---同一个对象 都可以if (ticket>0) {System.out.println(Thread.currentThread().getName()+"正在销售第"+ticket+"票");ticket--;}else {System.out.println(Thread.currentThread().getName()+"票已售完");break;}}}}
}//测试类-----main方法
public class TaskTest {public static void main(String[] args) {Task task = new Task(); //五个线程操作同一个任务for(int i=1;i<=5;i++) {new Thread(task,"窗口00"+i).start();}}
}
以下是方法3程序运行结果:
如有不妥之处,欢迎各位指正批评
java多线程之线程安全----铁路售票系统的实现相关推荐
- 基于JAVA+SpringMVC+Mybatis+MYSQL的铁路售票系统
项目功能: 登录注册 查看班次 查看车次详情 购票 退票 管理员登录 火车车次管理 添加火车车次 用户信息管理 站点管理 页面效果:
- 多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,一个售票窗口用一个线程表示。要求不能重复发售。
五一假期要到了,希望大家都都能开开心心 代码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; i ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- java 多线程使用线程池_Java多线程:如何开始使用线程
java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...
- 初学Java多线程:线程简介
Java多线程初学者指南系列教程http://developer.51cto.com/art/200911/162925.htm 初学Java多线程:线程简介 2009-06-29 17:49 ...
- Java多线程与线程并发库高级应用笔记
以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...
最新文章
- 双轴机械臂中的闭环步进电机平顺控制算法: 42HS48EIS,57HS
- JAVA多线程--Thinking in java
- Cotex-M内核双堆栈指针MSP和PSP
- [转]Jquery中AJAX错误信息调试参考
- MD5加密解密简介和应用
- P2241 统计方形(数据加强版)-- 70分 python3实现
- python 百度网盘下载提速_教你如何百度网盘的提高下载速度?
- 相邀直播app最新入驻58位海外阿姨
- 网站开发流程以及HTML5简介(七)
- 企业数字化转型以“活力”先行
- 整数规划_教学 | 线性(整数)规划的若干建模技巧
- 博客园电子期刊2010年2月刊发布啦
- 金蝶盘点机PDA轻松扫码产品入库,生产型企业进销存条码管理软件
- 《认知天性》听后感及听书笔记
- 传输层安全协议TLS/SSL
- shell命令之tar压缩与解压
- 波、波长以及频率的关系
- 如何在多台 群晖 NAS之间进行数据(硬盘)迁移
- APS推进实施的条件与基础
- 华为云计算之远程复制
热门文章
- 苹果(mac)更新喜马拉雅的xm后缀如何改成MP3,不知道windows适不适用
- 【英语语法入门】 第29讲 情态动词的否定和疑问
- Unity官方教程——VR in Unity: A Beginner‘s Guide (using VRTK)转译
- 2021邓州市二高高考成绩查询,邓州市二高中举行2021届高三冲刺高考誓师大会暨毕业典礼...
- 一月到十二月的英文简写和英文单词
- 信息通信网络机务员三级(高级)复习知识点
- 一位华裔复活了美国奥数国家队:掌舵 6 年 4 次夺冠,打破中国队“垄断”
- median函数 oracle9i,oracle10g学习笔记
- bootloader学习笔记---第一篇以stm32为例
- ASCII码格式转回汉字