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 }