售票案例:
火车站3个窗口售100张票.
1.自定义类SellTicket.java
1 package com.test.com.pers.thread; 2 3 /** 4 * Created by yadongliang on 2018/1/17 0017. 5 */ 6 public class SellTicket implements Runnable { 7 8 // 定义票数 9 private int ticketCount = 100;10 // 定义锁对象11 private Object object = new Object();12 13 @Override14 public void run() {15 while(true){16 synchronized(object){ // 同步机制, 同步代码块17 if (ticketCount > 0){18 try {19 Thread.sleep(100);// 为了模拟真实场景, 延迟100毫秒, 这样会出现同票和负数票(随机性和延迟性导致)问题(线程安全问题)20 } catch (InterruptedException e) {21 e.printStackTrace();22 }23 System.out.println(Thread.currentThread().getName() + " 正在出售第: " + (ticketCount--) + " 张票...");24 }25 }26 }27 }28 }
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 窗口1 正在出售第: 100 张票... 2 窗口1 正在出售第: 99 张票... 3 窗口1 正在出售第: 98 张票... 4 窗口1 正在出售第: 97 张票... 5 窗口1 正在出售第: 96 张票... 6 窗口1 正在出售第: 95 张票... 7 窗口1 正在出售第: 94 张票... 8 窗口1 正在出售第: 93 张票... 9 窗口1 正在出售第: 92 张票... 10 窗口1 正在出售第: 91 张票... 11 窗口1 正在出售第: 90 张票... 12 窗口1 正在出售第: 89 张票... 13 窗口1 正在出售第: 88 张票... 14 窗口1 正在出售第: 87 张票... 15 窗口1 正在出售第: 86 张票... 16 窗口1 正在出售第: 85 张票... 17 窗口1 正在出售第: 84 张票... 18 窗口1 正在出售第: 83 张票... 19 窗口1 正在出售第: 82 张票... 20 窗口1 正在出售第: 81 张票... 21 窗口1 正在出售第: 80 张票... 22 窗口1 正在出售第: 79 张票... 23 窗口3 正在出售第: 78 张票... 24 窗口3 正在出售第: 77 张票... 25 窗口3 正在出售第: 76 张票... 26 窗口3 正在出售第: 75 张票... 27 窗口3 正在出售第: 74 张票... 28 窗口3 正在出售第: 73 张票... 29 窗口2 正在出售第: 72 张票... 30 窗口3 正在出售第: 71 张票... 31 窗口3 正在出售第: 70 张票... 32 窗口3 正在出售第: 69 张票... 33 窗口3 正在出售第: 68 张票... 34 窗口3 正在出售第: 67 张票... 35 窗口3 正在出售第: 66 张票... 36 窗口3 正在出售第: 65 张票... 37 窗口3 正在出售第: 64 张票... 38 窗口3 正在出售第: 63 张票... 39 窗口3 正在出售第: 62 张票... 40 窗口3 正在出售第: 61 张票... 41 窗口3 正在出售第: 60 张票... 42 窗口3 正在出售第: 59 张票... 43 窗口3 正在出售第: 58 张票... 44 窗口3 正在出售第: 57 张票... 45 窗口1 正在出售第: 56 张票... 46 窗口1 正在出售第: 55 张票... 47 窗口1 正在出售第: 54 张票... 48 窗口1 正在出售第: 53 张票... 49 窗口1 正在出售第: 52 张票... 50 窗口3 正在出售第: 51 张票... 51 窗口2 正在出售第: 50 张票... 52 窗口2 正在出售第: 49 张票... 53 窗口3 正在出售第: 48 张票... 54 窗口3 正在出售第: 47 张票... 55 窗口3 正在出售第: 46 张票... 56 窗口3 正在出售第: 45 张票... 57 窗口3 正在出售第: 44 张票... 58 窗口3 正在出售第: 43 张票... 59 窗口1 正在出售第: 42 张票... 60 窗口1 正在出售第: 41 张票... 61 窗口1 正在出售第: 40 张票... 62 窗口3 正在出售第: 39 张票... 63 窗口3 正在出售第: 38 张票... 64 窗口3 正在出售第: 37 张票... 65 窗口3 正在出售第: 36 张票... 66 窗口3 正在出售第: 35 张票... 67 窗口3 正在出售第: 34 张票... 68 窗口3 正在出售第: 33 张票... 69 窗口3 正在出售第: 32 张票... 70 窗口2 正在出售第: 31 张票... 71 窗口3 正在出售第: 30 张票... 72 窗口3 正在出售第: 29 张票... 73 窗口3 正在出售第: 28 张票... 74 窗口3 正在出售第: 27 张票... 75 窗口3 正在出售第: 26 张票... 76 窗口1 正在出售第: 25 张票... 77 窗口1 正在出售第: 24 张票... 78 窗口1 正在出售第: 23 张票... 79 窗口1 正在出售第: 22 张票... 80 窗口1 正在出售第: 21 张票... 81 窗口1 正在出售第: 20 张票... 82 窗口1 正在出售第: 19 张票... 83 窗口1 正在出售第: 18 张票... 84 窗口1 正在出售第: 17 张票... 85 窗口3 正在出售第: 16 张票... 86 窗口2 正在出售第: 15 张票... 87 窗口2 正在出售第: 14 张票... 88 窗口2 正在出售第: 13 张票... 89 窗口3 正在出售第: 12 张票... 90 窗口3 正在出售第: 11 张票... 91 窗口3 正在出售第: 10 张票... 92 窗口3 正在出售第: 9 张票... 93 窗口3 正在出售第: 8 张票... 94 窗口3 正在出售第: 7 张票... 95 窗口1 正在出售第: 6 张票... 96 窗口1 正在出售第: 5 张票... 97 窗口1 正在出售第: 4 张票... 98 窗口1 正在出售第: 3 张票... 99 窗口1 正在出售第: 2 张票...100 窗口1 正在出售第: 1 张票...