java线程同步三个窗口卖100张票
时间: 2024-10-24 09:16:29 浏览: 13
Java多线程-线程的安全问题与线程的同步机制介绍
在Java中,当有多线程同时尝试访问并修改共享资源,比如三个窗口卖票这个场景,如果不进行适当的同步控制,可能会导致数据竞争、死锁等问题。为了确保公平性和一致性,可以使用synchronized关键字或者Lock接口来实现线程同步。
这里是一个简单的例子,假设我们有三个Window类,每个窗口都有ticketCount变量表示剩余票数:
```java
class Window {
private int ticketCount = 100;
private final Object lock; // 使用锁对象防止并发
public Window() {
this.lock = new Object();
}
synchronized void sellTicket(int num) {
if (ticketCount >= num) {
ticketCount -= num;
System.out.println(Thread.currentThread().getName() + " sold " + num + " tickets, remaining: " + ticketCount);
} else {
System.out.println(Thread.currentThread().getName() + " cannot sell more tickets, not enough.");
}
notifyAll(); // 如果票足够,唤醒其他等待的线程
}
public synchronized void waitForTicket() throws InterruptedException {
while (ticketCount == 0) {
wait(lock); // 等待,直到票数充足
}
}
}
public class TicketSale {
public static void main(String[] args) {
Window window1 = new Window();
Window window2 = new Window();
Window window3 = new Window();
Thread t1 = new Thread(() -> { window1.waitForTicket(); window1.sellTicket(50); });
Thread t2 = new Thread(() -> { window2.waitForTicket(); window2.sellTicket(30); });
Thread t3 = new Thread(() -> { window3.waitForTicket(); window3.sellTicket(20); });
t1.start();
t2.start();
t3.start();
}
}
```
在这个例子中,每个窗口都包含一个synchronized的sellTicket方法和waitForTicket方法,这样当一个线程获取到票(sellTicket)时,会先检查票是否足够,然后减票并通知其他等待的线程。如果票不够,则让出锁等待(waitForTicket)。通过这种方式,多个线程能够安全地协作卖票。
阅读全文