1.题目: 车站售票 代码实现火车站3个窗口同时卖25张车票的逻辑,同一个窗口不能卖同一张票 2.提示:synchronized修饰成员方法时,则一个线程要执行该方法,必须取得该方法所在的对象的锁,即某个synchronized成员方法被调用时,其它synchronized成员方法不可被调用。 3.参考代码结构如下 public class TicketDemo { public static void main(String[] args) { } } icket类,有销售票方法sales()。每售出一张票,票的总数减一 class Ticket{ private int ticketNumber = 25; } 4.用Java语言 5.不用实现每个窗口都售卖一张票的可能,而是随机窗口售卖一张票,售卖完一张票后继续售卖下一张票
时间: 2024-02-09 10:10:51 浏览: 34
代码如下:
```
public class TicketDemo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(() -> {
while (ticket.getTicketNumber() > 0) {
synchronized (ticket) {
if (ticket.getTicketNumber() > 0) {
ticket.sales();
System.out.println(Thread.currentThread().getName() + " 售出一张票,余票 " + ticket.getTicketNumber());
}
}
}
}, "窗口1").start();
new Thread(() -> {
while (ticket.getTicketNumber() > 0) {
synchronized (ticket) {
if (ticket.getTicketNumber() > 0) {
ticket.sales();
System.out.println(Thread.currentThread().getName() + " 售出一张票,余票 " + ticket.getTicketNumber());
}
}
}
}, "窗口2").start();
new Thread(() -> {
while (ticket.getTicketNumber() > 0) {
synchronized (ticket) {
if (ticket.getTicketNumber() > 0) {
ticket.sales();
System.out.println(Thread.currentThread().getName() + " 售出一张票,余票 " + ticket.getTicketNumber());
}
}
}
}, "窗口3").start();
}
}
class Ticket {
private int ticketNumber = 25;
public void sales() {
ticketNumber--;
}
public int getTicketNumber() {
return ticketNumber;
}
}
```
以上代码中,Ticket 类中的 sales() 方法被 synchronized 关键字修饰,保证同一时刻只有一个线程可以进入该方法,从而避免多个线程同时售卖同一张票。三个窗口分别使用了三个线程进行模拟售票操作,每个线程在 while 循环中不断判断票数是否大于 0,如果是,就执行售票操作,并输出售票信息。同时,每个线程在进入 synchronized 块之前,都要先判断一次票数是否大于 0,这样可以避免多个线程在票数已经为 0 的情况下仍然尝试执行售票操作。