如何使用多线程公平模拟 100 人抢 10 张票?

ID:17144 / 打印

如何使用多线程公平模拟 100 人抢 10 张票?

如何公平地模拟多线程抢票

问题描述:
如何使用多线程模拟 100 个人抢夺 10 张票,同时保证每个人都有公平的机会获得票?

解决方案:

为了确保公平性,我们可以使用并发集合(例如 concurrenthashset)来存储可用的票,并使用原子变量(例如 atomicinteger)来跟踪已售出的票数。此外,可以引入公平锁(通过设置 fair=true),以确保每个人都有相同的机会获得锁。

代码示例:

import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock;  public class TicketGrabber {      private final ConcurrentHashMap<Integer, Ticket> availableTickets;     private final AtomicInteger soldTickets;     private final ReentrantLock lock = new ReentrantLock(true); // 公平锁      public TicketGrabber(int numTickets) {         this.availableTickets = new ConcurrentHashMap<>();         for (int i = 0; i < numTickets; i++) {             availableTickets.put(i, new Ticket());         }         this.soldTickets = new AtomicInteger(0);     }      public Ticket grabTicket() {         // 上锁         lock.lock();         try {             // 检查是否有可用的票             if (soldTickets.get() >= availableTickets.size()) {                 return null; // 所有票已售出             }             // 找到一张可用的票             for (Integer ticketId : availableTickets.keySet()) {                 if (availableTickets.containsKey(ticketId)) {                     Ticket ticket = availableTickets.get(ticketId);                     availableTickets.remove(ticketId); // 标记为已售出                     soldTickets.incrementAndGet(); // 增加已售出的票数                     return ticket;                 }             }             return null; // 找不到可用的票         } finally {             // 解锁             lock.unlock();         }     }      // ... 其他代码 ...  }

如何使用:

  • 创建一个 ticketgrabber 对象,并传入可用的票数。
  • 使用 grabticket() 方法让每个线程尝试抢票。
  • 如果有票可用,该方法将返回一张票,否则返回 null。
上一篇: 如何使用 IntelliJ IDEA 或 Eclipse 将 Java 程序转换为可执行文件?
下一篇: 反射 NoSuchMethodException:为什么调用 getName 方法时会抛出异常?

作者:admin @ 24资源网   2024-11-27

本站所有软件、源码、文章均有网友提供,如有侵权联系308410122@qq.com

与本文相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。