以下是使用 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 关键字,我们实现了多线程模拟买票,并保证了线程的安全性。

Java 多线程模拟买票:使用 FixedThreadPool 和 synchronized 保证线程安全

原文地址: https://www.cveoy.top/t/topic/qeeG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录