java多线程(三)之售票案例
售票案例:
火车站3个窗口售100张票.
1.自定义类SellTicket.java
package com.test.com.pers.thread; /**
* Created by yadongliang on 2018/1/17 0017.
*/
public class SellTicket implements Runnable { // 定义票数
private int ticketCount = 100;
// 定义锁对象
private Object object = new Object(); @Override
public void run() {
while(true){
synchronized(object){// 同步机制, 同步代码块
if (ticketCount > 0){
try {
Thread.sleep(100);// 为了模拟真实场景, 延迟100毫秒, 这样会出现同票和负数票(随机性和延迟性导致)问题(线程安全问题)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 正在出售第: " + (ticketCount--) + " 张票...");
}
}
}
}
}
2.SellTicketDemo.java
package com.test.com.pers.thread; /**
* Created by yadongliang on 2018/1/17 0017.
*
* 如何解决线程安全问题:
* 要想解决线程安全问题, 首先要知道哪些原因会导致出问题:(这些问题也是判断一个程序是否会有安全问题的标准)
* 1.是否是多线程环境
* 2.是否有共享数据
* 3.是否有多条语句操作共享数据(是否是原子性操作)
* 如何解决呢?
* 思想:
* 把多条语句操作共享数据的代码包成一个整体, 让某个线程执行的过程中, 别的线程不能执行.
* 具体操作:
* 引入了同步机制这个概念.
* 同步代码块:
* synchronized(对象){
* 需要同步的代码;
* }
* 1.对象是什么?
* 可以随便创建一个对象
* 2.需要同步的代码是什么?
* 多条语句操作共享数据的代码
* 注意: 同步可以解决线程安全问题的根本原因就在这个对象身上, 该对象如同锁的功能, 多个线程必须是同一把锁.
*/
public class SellTicketDemo { public static void main(String[] args) {
// 创建自定义类实例
SellTicket sellTicket = new SellTicket();
// 创建线程对象(窗口)
Thread t1 = new Thread(sellTicket, "窗口1");
Thread t2 = new Thread(sellTicket, "窗口2");
Thread t3 = new Thread(sellTicket, "窗口3");
// 启动线程
t1.start();
t2.start();
t3.start();
}
}
执行结果:
窗口1 正在出售第: 100 张票...
窗口1 正在出售第: 99 张票...
窗口1 正在出售第: 98 张票...
窗口1 正在出售第: 97 张票...
窗口1 正在出售第: 96 张票...
窗口1 正在出售第: 95 张票...
窗口1 正在出售第: 94 张票...
窗口1 正在出售第: 93 张票...
窗口1 正在出售第: 92 张票...
窗口1 正在出售第: 91 张票...
窗口1 正在出售第: 90 张票...
窗口1 正在出售第: 89 张票...
窗口1 正在出售第: 88 张票...
窗口1 正在出售第: 87 张票...
窗口1 正在出售第: 86 张票...
窗口1 正在出售第: 85 张票...
窗口1 正在出售第: 84 张票...
窗口1 正在出售第: 83 张票...
窗口1 正在出售第: 82 张票...
窗口1 正在出售第: 81 张票...
窗口1 正在出售第: 80 张票...
窗口1 正在出售第: 79 张票...
窗口3 正在出售第: 78 张票...
窗口3 正在出售第: 77 张票...
窗口3 正在出售第: 76 张票...
窗口3 正在出售第: 75 张票...
窗口3 正在出售第: 74 张票...
窗口3 正在出售第: 73 张票...
窗口2 正在出售第: 72 张票...
窗口3 正在出售第: 71 张票...
窗口3 正在出售第: 70 张票...
窗口3 正在出售第: 69 张票...
窗口3 正在出售第: 68 张票...
窗口3 正在出售第: 67 张票...
窗口3 正在出售第: 66 张票...
窗口3 正在出售第: 65 张票...
窗口3 正在出售第: 64 张票...
窗口3 正在出售第: 63 张票...
窗口3 正在出售第: 62 张票...
窗口3 正在出售第: 61 张票...
窗口3 正在出售第: 60 张票...
窗口3 正在出售第: 59 张票...
窗口3 正在出售第: 58 张票...
窗口3 正在出售第: 57 张票...
窗口1 正在出售第: 56 张票...
窗口1 正在出售第: 55 张票...
窗口1 正在出售第: 54 张票...
窗口1 正在出售第: 53 张票...
窗口1 正在出售第: 52 张票...
窗口3 正在出售第: 51 张票...
窗口2 正在出售第: 50 张票...
窗口2 正在出售第: 49 张票...
窗口3 正在出售第: 48 张票...
窗口3 正在出售第: 47 张票...
窗口3 正在出售第: 46 张票...
窗口3 正在出售第: 45 张票...
窗口3 正在出售第: 44 张票...
窗口3 正在出售第: 43 张票...
窗口1 正在出售第: 42 张票...
窗口1 正在出售第: 41 张票...
窗口1 正在出售第: 40 张票...
窗口3 正在出售第: 39 张票...
窗口3 正在出售第: 38 张票...
窗口3 正在出售第: 37 张票...
窗口3 正在出售第: 36 张票...
窗口3 正在出售第: 35 张票...
窗口3 正在出售第: 34 张票...
窗口3 正在出售第: 33 张票...
窗口3 正在出售第: 32 张票...
窗口2 正在出售第: 31 张票...
窗口3 正在出售第: 30 张票...
窗口3 正在出售第: 29 张票...
窗口3 正在出售第: 28 张票...
窗口3 正在出售第: 27 张票...
窗口3 正在出售第: 26 张票...
窗口1 正在出售第: 25 张票...
窗口1 正在出售第: 24 张票...
窗口1 正在出售第: 23 张票...
窗口1 正在出售第: 22 张票...
窗口1 正在出售第: 21 张票...
窗口1 正在出售第: 20 张票...
窗口1 正在出售第: 19 张票...
窗口1 正在出售第: 18 张票...
窗口1 正在出售第: 17 张票...
窗口3 正在出售第: 16 张票...
窗口2 正在出售第: 15 张票...
窗口2 正在出售第: 14 张票...
窗口2 正在出售第: 13 张票...
窗口3 正在出售第: 12 张票...
窗口3 正在出售第: 11 张票...
窗口3 正在出售第: 10 张票...
窗口3 正在出售第: 9 张票...
窗口3 正在出售第: 8 张票...
窗口3 正在出售第: 7 张票...
窗口1 正在出售第: 6 张票...
窗口1 正在出售第: 5 张票...
窗口1 正在出售第: 4 张票...
窗口1 正在出售第: 3 张票...
窗口1 正在出售第: 2 张票...
窗口1 正在出售第: 1 张票...
java多线程(三)之售票案例的更多相关文章
- java 多线程三
java 多线程一 java 多线程二 java 多线程三 java 多线程四 注意到 java 多线程一 中 MyThread2 运行结果出现0.-1,那是因为在操作共享数据时没有加锁导致. 加锁的 ...
- Java多线程——线程八锁案例分析
Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...
- Java多线程——<三>简单的线程执行:Executor
一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...
- java多线程(三)-Executors实现的几种线程池以及Callable
从java5开始,类库中引入了很多新的管理调度线程的API,最常用的就是Executor(执行器)框架.Executor帮助程序员管理Thread对象,简化了并发编程,它其实就是在 提供了一个中间层, ...
- 从零开始学习Java多线程(三)
本文主要对Java多线程同步与通信以及相关锁的介绍. 1 .Java多线程安全问题 Java多线程安全问题是实现并发最大的问题,可以说多线程开发其实就是围绕多线程安全问题开发,涉及之深,不是简简单单一 ...
- java多线程三之线程协作与通信实例
多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...
- JAVA多线程三种实现方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- Java 多线程 三种实现方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- java多线程三种方式
java多线程都有几种方式 有三种: (1)继承Thread类,重写run函数 创建: class xx extends Thread{ public void run(){ Thread.sleep ...
随机推荐
- json和gson的区别
json是一种数据格式,便于数据传输.存储.交换gson是一种组件库,可以把java对象数据转换成json数据格式 GSON简单处理JSON json格式经常需要用到,google提供了一个处理jso ...
- 【BZOJ】【2200】【USACO 2011 Jan】道路和航线
做了一天…… TLE:数组开小了-_-#道路是有50000的,双向要乘二.(我特么怎么想的就以为是树了……) WA:一些大点都WA了,小点都过了.好纠结…… AC了QAQ,不知道为什么,在并查集合并的 ...
- 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法
整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...
- 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX
ylbtech-Oracle:数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX 表空间 > 编辑 表空间: SYSAUX 1. 一般信息返 ...
- iOS:UIScrollView控件和UIPageControl控件的详解
UIScrollView滚动视图控件和UIPageControl分页视图控件: UIScrollView用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,当然UIPagecon ...
- 我所遭遇过的游戏中间件---nvDXTLib
我所遭遇过的游戏中间件---nvDXTLib nvDXTLib是Nvidia提供的一套用于DXT纹理压缩SDK.接口十分简洁,就是提供了几个纹理压缩的函数,其中我使用最多的函数是: DXTLIB_AP ...
- UVA 10012 How Big Is It?(暴力枚举)
How Big Is It? Ian's going to California, and he has to pack his things, including his collection ...
- Candy leetcode java
题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...
- 前端要给力之:URL应该有多长?
URL到底应该有多长?我为什么要提这个问题呢?有许多优化指南里都写着:要尽量减小COOKIE.缩短URL,以及尽可能地使用GET请求等等,以便优化WEB页面的请求和装载.但是,这种所谓“尽可能”.“尽 ...
- Bootstrap popover弹出框
popover被挤压.遮挡的问题: 弹出框显示的时候如果贴近一个列的边沿,就会很窄或被遮挡,解决起来很简单,只需在初始化的时候添加一个container属性就可以了: $(function (){ $ ...