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 }