public class TestRePtactice {
// 多线程:三个窗口卖同时卖同一种票(100张)
// 三个线程一个对象
public static void main(String[] args) {
Ticket ticket = new Ticket();
// 创建三个线程
Thread t1 = new Thread(ticket, "窗口1");
Thread t2 = new Thread(ticket, "窗口2");
Thread t3 = new Thread(ticket, "窗口3");
// start() 方法开启线程
t1.start();
t2.start();
t3.start();
}
}
class Ticket implements Runnable {
//总票数
int count = 100;
Object object = new Object();
@Override
public void run() {
while (true) {
try {
//线程休眠1毫秒
//可能使线程安全隐患更明显
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
//同步代码块:代码块内只允许存在一个线程
//同步代码块可以消除线程安全隐患但会降低效率,所以尽量少用
//锁资源 (object) 可以是任意对象但要保证多线程统一
//方法区中资源是共享的,也可以作为锁资源
synchronized (object) {
if (count < 1) {
break;
}
System.out.println(Thread.currentThread().getName() + "正在卖" + count-- + "号票");
}
}
}
}
发现的错误截图:
正确截图: