目前有三个窗口同时出售20张票,需要你在右侧代码中的 Begin-End 区域编写代码实现多个窗口售票的功能,具体要求如下: 票数要使用同一个静态值; 为保证不会出现卖出同一张票,使用java多线程同步锁(synchronized或lock)
时间: 2024-12-11 20:27:56 浏览: 11
为了实现多个窗口售票的多线程同步功能,你可以使用`synchronized`关键字来确保对票库存和销售操作的互斥访问。首先,你需要在类中声明一个静态变量来存储票数,然后为每个窗口创建一个独立的线程,使用`synchronized`来保护共享资源。
以下是一个简单的Java示例:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Ticket {
static int totalTickets = 20; // 共享票数
private static final Lock lock = new ReentrantLock(); // 使用ReentrantLock作为同步锁
public synchronized void sellTicket(int window) {
if (totalTickets > 0) { // 票还有的情况
System.out.println("Window " + window + ": Selling ticket, remaining: " + totalTickets - 1);
totalTickets--;
} else {
System.out.println("Window " + window + ": No more tickets available.");
}
}
}
class WindowThread extends Thread {
private int windowNumber;
public WindowThread(int window) {
this.windowNumber = window;
this.setName("Window " + window); // 窗口名称便于识别
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
lock.lock();
// 锁定代码块,避免并发修改总票数
Ticket.sellTicket(windowNumber);
Thread.sleep(500); // 模拟窗口售票过程
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock(); // 销毁锁
}
}
}
}
public class MultiWindowSale {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
new WindowThread(i).start(); // 创建并启动三个窗口线程
}
}
}
```
在这个例子中,我们创建了`WindowThread`类来模拟每个窗口的售票操作。`sellTicket`方法是`synchronized`的,所以当一个窗口尝试卖票时,其他窗口会等待该方法结束。当票售罄时,会打印相应的提示。
阅读全文