案例:

铁道部发布了一个售票任务,要求销售1000张票,要求有5个窗口来进行销售,请编写多线程程序来模拟这个效果
窗口001正在销售第1000张票
窗口001正在销售第999张票
窗口002正在销售第998张票
.。。。
窗口05正在销售第1张票
票已经销售完毕

下面我们就此系统进行一个简单的分析:
代码编写可能会出现的问题及解决案:

  1. 出现部分重票-------原因:每个线程都有可能去执行打印总票数
    解决方案:加锁确保线程安全,注意锁的范围,锁的对象

  2. 代码执行出现负数--------原因:多个线程都进入循环的判断,在锁外等待
    解决方案:在锁内增加判断

注意:每个线程执行完都要退出

需要导入的包为

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多线程之线程安全----铁路售票系统的实现相关推荐

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的铁路售票系统

    项目功能: 登录注册 查看班次 查看车次详情 购票 退票 管理员登录 火车车次管理 添加火车车次 用户信息管理 站点管理 页面效果:

  2. 多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,一个售票窗口用一个线程表示。要求不能重复发售。

    五一假期要到了,希望大家都都能开开心心 代码 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; i ...

  3. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  4. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  5. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  6. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

  7. java 多线程使用线程池_Java多线程:如何开始使用线程

    java 多线程使用线程池 什么是线程? (What is a Thread?) A thread is a lightweight process. Any process can have mul ...

  8. 初学Java多线程:线程简介

     Java多线程初学者指南系列教程http://developer.51cto.com/art/200911/162925.htm 初学Java多线程:线程简介 2009-06-29 17:49 ...

  9. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

最新文章

  1. 双轴机械臂中的闭环步进电机平顺控制算法: 42HS48EIS,57HS
  2. JAVA多线程--Thinking in java
  3. Cotex-M内核双堆栈指针MSP和PSP
  4. [转]Jquery中AJAX错误信息调试参考
  5. MD5加密解密简介和应用
  6. P2241 统计方形(数据加强版)-- 70分 python3实现
  7. python 百度网盘下载提速_教你如何百度网盘的提高下载速度?
  8. 相邀直播app最新入驻58位海外阿姨
  9. 网站开发流程以及HTML5简介(七)
  10. 企业数字化转型以“活力”先行
  11. 整数规划_教学 | 线性(整数)规划的若干建模技巧
  12. 博客园电子期刊2010年2月刊发布啦
  13. 金蝶盘点机PDA轻松扫码产品入库,生产型企业进销存条码管理软件
  14. 《认知天性》听后感及听书笔记
  15. 传输层安全协议TLS/SSL
  16. shell命令之tar压缩与解压
  17. 波、波长以及频率的关系
  18. 如何在多台 群晖 NAS之间进行数据(硬盘)迁移
  19. APS推进实施的条件与基础
  20. 华为云计算之远程复制

热门文章

  1. 苹果(mac)更新喜马拉雅的xm后缀如何改成MP3,不知道windows适不适用
  2. 【英语语法入门】 第29讲 情态动词的否定和疑问
  3. Unity官方教程——VR in Unity: A Beginner‘s Guide (using VRTK)转译
  4. 2021邓州市二高高考成绩查询,邓州市二高中举行2021届高三冲刺高考誓师大会暨毕业典礼...
  5. 一月到十二月的英文简写和英文单词
  6. 信息通信网络机务员三级(高级)复习知识点
  7. 一位华裔复活了美国奥数国家队:掌舵 6 年 4 次夺冠,打破中国队“垄断”
  8. median函数 oracle9i,oracle10g学习笔记
  9. bootloader学习笔记---第一篇以stm32为例
  10. ASCII码格式转回汉字