Java 多线程模拟买票:使用 FixedThreadPool 和 synchronized 保证线程安全
以下是使用 Java 的 juc 包中的 FixedThreadPool 实现的模拟买票的代码,并利用 synchronized 关键字保证线程的安全性:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TicketCounter {
private int availableTickets = 100; // 假设一共有 100 张票
public synchronized void sellTicket(int num) {
if (availableTickets >= num) {
availableTickets -= num;
System.out.println(Thread.currentThread().getName() + ' 卖出 ' + num + ' 张票,剩余 ' + availableTickets + ' 张票');
} else {
System.out.println(Thread.currentThread().getName() + ' 剩余票数不足,无法卖出');
}
}
public static void main(String[] args) {
TicketCounter ticketCounter = new TicketCounter();
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
executorService.execute(() -> {
ticketCounter.sellTicket(1);
});
}
executorService.shutdown();
}
}
在上述代码中,我们创建了一个 TicketCounter 类,它有一个 availableTickets 变量表示剩余的票数。sellTicket 方法使用 synchronized 关键字修饰,以保证在同一时刻只有一个线程可以访问该方法。如果剩余票数足够,线程会卖出指定数量的票,并输出剩余的票数;否则输出剩余票数不足的提示。
在 main 方法中,我们创建了一个 FixedThreadPool,容量为 3,然后循环提交 10 个任务,每个任务调用 TicketCounter 的 sellTicket 方法卖出 1 张票。最后调用 executorService 的 shutdown 方法关闭线程池。
这样,通过使用 FixedThreadPool 和 synchronized 关键字,我们实现了多线程模拟买票,并保证了线程的安全性。
原文地址: https://www.cveoy.top/t/topic/qeeG 著作权归作者所有。请勿转载和采集!