售票案例:

火车站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多线程(三)之售票案例的更多相关文章

  1. java 多线程三

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 注意到 java 多线程一 中 MyThread2 运行结果出现0.-1,那是因为在操作共享数据时没有加锁导致. 加锁的 ...

  2. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  3. Java多线程——<三>简单的线程执行:Executor

    一.概述 按照<Java多线程——<一><二>>中所讲,我们要使用线程,目前都是显示的声明Thread,并调用其start()方法.多线程并行,明显我们需要声明多个 ...

  4. java多线程(三)-Executors实现的几种线程池以及Callable

    从java5开始,类库中引入了很多新的管理调度线程的API,最常用的就是Executor(执行器)框架.Executor帮助程序员管理Thread对象,简化了并发编程,它其实就是在 提供了一个中间层, ...

  5. 从零开始学习Java多线程(三)

    本文主要对Java多线程同步与通信以及相关锁的介绍. 1 .Java多线程安全问题 Java多线程安全问题是实现并发最大的问题,可以说多线程开发其实就是围绕多线程安全问题开发,涉及之深,不是简简单单一 ...

  6. java多线程三之线程协作与通信实例

    多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...

  7. JAVA多线程三种实现方式

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  8. Java 多线程 三种实现方式

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  9. java多线程三种方式

    java多线程都有几种方式 有三种: (1)继承Thread类,重写run函数 创建: class xx extends Thread{ public void run(){ Thread.sleep ...

随机推荐

  1. json和gson的区别

    json是一种数据格式,便于数据传输.存储.交换gson是一种组件库,可以把java对象数据转换成json数据格式 GSON简单处理JSON json格式经常需要用到,google提供了一个处理jso ...

  2. 【BZOJ】【2200】【USACO 2011 Jan】道路和航线

    做了一天…… TLE:数组开小了-_-#道路是有50000的,双向要乘二.(我特么怎么想的就以为是树了……) WA:一些大点都WA了,小点都过了.好纠结…… AC了QAQ,不知道为什么,在并查集合并的 ...

  3. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  4. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: SYSAUX  表空间  >  编辑 表空间: SYSAUX 1. 一般信息返 ...

  5. iOS:UIScrollView控件和UIPageControl控件的详解

    UIScrollView滚动视图控件和UIPageControl分页视图控件:    UIScrollView用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,当然UIPagecon ...

  6. 我所遭遇过的游戏中间件---nvDXTLib

    我所遭遇过的游戏中间件---nvDXTLib nvDXTLib是Nvidia提供的一套用于DXT纹理压缩SDK.接口十分简洁,就是提供了几个纹理压缩的函数,其中我使用最多的函数是: DXTLIB_AP ...

  7. 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 ...

  8. Candy leetcode java

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

  9. 前端要给力之:URL应该有多长?

    URL到底应该有多长?我为什么要提这个问题呢?有许多优化指南里都写着:要尽量减小COOKIE.缩短URL,以及尽可能地使用GET请求等等,以便优化WEB页面的请求和装载.但是,这种所谓“尽可能”.“尽 ...

  10. Bootstrap popover弹出框

    popover被挤压.遮挡的问题: 弹出框显示的时候如果贴近一个列的边沿,就会很窄或被遮挡,解决起来很简单,只需在初始化的时候添加一个container属性就可以了: $(function (){ $ ...