天天看點

使用同步代碼塊解決繼承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 }      

此為本人學習筆記,若有錯誤,請不吝賜教