package com.atguigu.java;
/**
* 使用同步代码块解决线程安全问题
*
* 例子:创建三个窗口卖票,总共100张,使用继承Thread类的方式
*
*说明:在继承Thread类创建多线程的方式中,慎用this充当同步监视器,
* 考虑使用当前类充当同步监视器
*
* @author Dxkstart
* @create 2021-05-06 21:24
*/
public class WindowTest3 {
public static void main(String[] args) {
Window w1 = new Window();
Window w2 = new Window();
Window w3 = new Window();
w1.start();
w2.start();
w3.start();
}
}
class Window extends Thread {
private static int ticket = 100;//票数
static Object obj = new Object();//锁,要加static才能是唯一的锁
@Override
public void run() {
while(true) {
synchronized (Window.class){
// synchronized(obj) {
//错误的方式:此时的this代表t1,t2,t3三个对象
// synchronized(this) {
if (ticket > 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + ": 卖票,票号为" + ticket);
ticket--;
} else {
break;
}
}
}
}
}