
多线程模拟公平抢票
为了解决如何模拟 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();
}
}
}










