如何使用多线程模拟公平抢票?
多线程模拟公平抢票
为了解决如何模拟 100 个人抢 10 张票的问题,需要确保公平性。以下是一些可供参考的解决方案:
- concurrenthashset 和 atomicinteger:concurrenthashset 是一个并发线程安全的集合,而 atomicinteger 是一个原子性的整数。我们可以使用 concurrenthashset 来记录已售出的票号,并使用 atomicinteger 来记录剩余票数。当线程抢票时,它们可以尝试从 concurrenthashset 中获取一个随机票号,并且如果票号可用,则使用 atomicinteger 递减剩余票数。
- 公平锁:公平锁是一种锁,它可以保证线程以申请锁的顺序获取锁。在抢票场景中,我们可以使用 reentrantlock 和其 fair=true 选项来实现公平锁。这样,线程将按顺序获取锁,以确保公平性。以下代码示例展示了如何使用公平锁实现抢票:
import java.util.concurrent.locks.ReentrantLock; public class FairTicket搶票 { private static final int TOTAL_TICKETS = 10; private static final int TOTAL_USERS = 100; // 使用公平锁 private static ReentrantLock fairLock = new ReentrantLock(true); public static void main(String[] args) { for (int i = 0; i < TOTAL_USERS; i++) { new Thread(() -> { fairLock.lock(); try { if (TOTAL_TICKETS > 0) { System.out.println("用户" + Thread.currentThread().getName() + "抢到了第" + TOTAL_TICKETS + "张票"); TOTAL_TICKETS--; } else { System.out.println("用户" + Thread.currentThread().getName() + "没有抢到票"); } } finally { fairLock.unlock(); } }).start(); } } }
以上就是如何使用多线程模拟公平抢票?的详细内容,更多请关注其它相关文章!