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();
}
}