赞
踩
public class TicketDemo { // 票总数 private int ticketNum = 10; /** * 抢票 */ public void getTicket() { if (ticketNum <= 0) { return; } System.out.println(Thread.currentThread().getName() + " 抢到一张票,剩余:" + ticketNum); // 非原子性操作 ticketNum--; } /** * 测试:20个人抢一张票 */ public static void main(String[] args) { TicketDemo ticketDemo = new TicketDemo(); for (int i = 0; i < 20; i++) { new Thread(ticketDemo::getTicket).start(); } } }
执行结果:
可以看到出现了 超卖问题,一共10张票,当20个线程一起抢票就出现有11个人抢到了票。这是因为如果两个线程同时通过了 if 校验。
所以我们需要对票数的操作进行加锁,保证同一时间只有一个线程来检查和操作票数扣减。
public class TicketDemo { // 锁 private static Object lock = new Object(); // 票总数 private int ticketNum = 10; /** * 抢票 */ public void getTicket() { synchronized (lock) { if
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。