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 }