三个窗口卖票(实现Runnable方式创建线程)之线程安全问题

 1 package day2_4;
 2 
 3 /**
 4  * 例子:创建三个窗口卖票,总票数为100张,使用实现Runnable接口
 5  * 因为三个线程是共享Window2对象的,所以也是共享ticket变量的,自然就不用static修饰 ticket了
 6  * 仍存在线程安全问题,待解决(还是会有多个线程卖出少量的相同号的票)
 7  *
 8  * @Author Tianhao
 9  * @create 2021-02-04-14:36
10  */
11 
12 class Window2 implements Runnable {
13     //可以不用static 修饰 ticket了
14     private int ticket = 100;
15 
16     @Override
17     public void run() {
18 //        while (ticket>0) {
19 //            System.out.println(Thread.currentThread().getName() + "卖票,票号:" + ticket);
20 //            ticket--;
21 //        }
22 
23         while (true) {
24             if (ticket > 0) {
25                 try {
26                     Thread.sleep(100);
27                 } catch (InterruptedException e) {
28                     e.printStackTrace();
29                 }
30                 System.out.println(Thread.currentThread().getName() + "卖票,票号:" + ticket);
31                 ticket--;
32             } else {
33                 break;
34             }
35         }
36     }
37 }
38 
39 
40 public class WindowTest2 {
41     public static void main(String[] args) {
42         Window2 w = new Window2();
43         //Thread构造器内都是同一个Window2对象w,所以共享ticket成员变量
44         Thread t1 = new Thread(w);
45         Thread t2 = new Thread(w);
46         Thread t3 = new Thread(w);
47         t1.setName("窗口1");
48         t2.setName("窗口2");
49         t3.setName("窗口3");
50         t1.start();
51         t2.start();
52         t3.start();
53 
54     }
55 }
原文地址:https://www.cnblogs.com/zui-ai-java/p/14377415.html