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 }