使用同步代码块解决继承Thread类的方式的线程安全问题

 1 package com.atfu.java01;
 2 
 3 /**
 4  * 例子:创建三个窗口卖票,总票数为100张,使用继承Thread类的方式。
 5  *存在线程安全问题,待解决。
 6  *
 7  *使用同步代码块解决继承Thread类的方式的线程安全问题
 8  *
 9  * 说明:在使用继承Thread类创建多线程的方式中,慎用this来充当同步监视器。考虑使用当前类来充当同步监视器。
10  *
11  *
12  * @author fu jingchao
13  * @creat 2021/10/17-14:59
14  */
15 class Window2 extends Thread{
16     private static int ticket = 100;
17     private static Object obj = new Object();
18     @Override
19     public void run() {
20 
21         while (true) {
22 //            synchronized(obj) {
23             synchronized(Window2.class) {//Window2.class也是一个对象,只会加载一次;Class class = Window.class
24                 //synchronized(this)是错误的方式:this代表着t1,t2,t3三个对象,锁不唯一。
25                 if (ticket > 0) {
26                     try {
27                         Thread.sleep(100);
28                     } catch (InterruptedException e) {
29                         e.printStackTrace();
30                     }
31                     System.out.println(getName() + ":卖票,票号为:" + ticket);
32                     ticket--;
33                 } else {
34                     break;
35                 }
36             }
37         }
38     }
39 }
40 
41 public class WindowTest2 {
42     public static void main(String[] args) {
43         Window2 w1 = new Window2();
44         Window2 w2 = new Window2();
45         Window2 w3 = new Window2();
46         w1.setName("窗口一");
47         w2.setName("窗口二");
48         w3.setName("窗口三");
49         w1.start();
50         w2.start();
51         w3.start();
52     }
53 }

 

posted @ 2021-10-18 22:40  橘猫的夏天  阅读(65)  评论(0)    收藏  举报