(对于实现Runnable接口)线程安全问题解决方式二:同步方法

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

 

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