package com; /** * @author 冀帅 * @date 2020/8/1-15:31 * 使用同步方法来处理继承Thread类的线程安全问题 * 同步方法使用的锁是this(当前对象),而当前对象有三个,所以若是用继承Runnable的方法处理则还是不安全 * 所以同步方法前要加static ---------区别 * * 总结:1.同步方法仍需要同步监视器,只是不需要我们显示声明 * 2.非静态的同步方法:同步监视器是this(实现方式) * 静态(static)同步方法:同步监视器是当前类本身 */ class MyWindoow extends Thread{ private static int tickets = 100; // private static Object obj =new Object(); @Override public void run() { while (true){ show(); //synchronized (obj) { //} } } private static synchronized void show(){//同步监视器是当前类:WindowTest4 // private synchronized void show(){ 同步监视器是this(t1,t2,t3) if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":卖票" + tickets); tickets--; } } } public class WindowTest4 { public static void main(String[] args) { MyWindoow t1 = new MyWindoow(); MyWindoow t2 = new MyWindoow(); MyWindoow t3 = new MyWindoow(); t1.setName("窗口Q"); t2.setName("窗口W"); t3.setName("窗口E"); t1.start(); t2.start(); t3.start(); } }