(对于继承Thread类)线程安全问题解决方式二:同步静态方法

 1 package day2_4;
 2 
 3 /**
 4  * 使用同步方法解决继承Thread类的线程安全问题
 5  *
 6  * <p>
 7  * 如果操作共享数据的代码完整的声明在一个方法中,在方法定义上,用synchronized修饰,即同步方法
 8  *
 9  * 关于同步方法的总结:
10  * 1.同步方法仍然涉及到同步监视器,只是不需要我们显式的声明
11  * 2.非静态的同步方法,默认的同步监视器是:this
12  *   静态的同步方法,默认的同步监视器是:当前类本身
13  *
14  * @Author Tianhao
15  * @create 2021-02-05-15:04
16  */
17 
18 
19 class Window6 extends Thread {
20     private static int ticket = 100;
21 
22     @Override
23     public void run() {
24         while (ticket > 0) {
25             sale();
26             try {
27                 sleep(10);
28             } catch (InterruptedException e) {
29                 e.printStackTrace();
30             }
31         }
32     }
33 
34     //不正确,因为多个线程的同步监视器不能共享,所以不能实现同步
35     //private synchronized void sale() {//默认的同步监视器仍然是this,也就是t1,t2,t3
36     //正确的,同步的静态方法
37     private static synchronized void sale(){ //记住加上static修饰,默认同步监视器就是当前类的Class对象(Window6.class)
38         if (ticket > 0) {
39             System.out.println(Thread.currentThread().getName() + "卖票,票号:" + ticket);
40             ticket--;
41         }
42     }
43 
44 }
45 
46 
47 public class WindowTest6 {
48     public static void main(String[] args) {
49         Window6 t1 = new Window6();
50         Window6 t2 = new Window6();
51         Window6 t3 = new Window6();
52         t1.setName("窗口1");
53         t2.setName("窗口2");
54         t3.setName("窗口3");
55         t1.start();
56         t2.start();
57         t3.start();
58     }
59 
60 
61 }

 

posted @ 2021-02-05 15:45  dog_IT  阅读(150)  评论(0编辑  收藏  举报