推荐答案
// www.javascriptcn.com code example
import java.util.concurrent.atomic.AtomicInteger;
public class SeckillSystem {
private static final int MAX_STOCK = 100; // 最大库存
private static AtomicInteger stock = new AtomicInteger(MAX_STOCK); // 当前库存
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
if (stock.get() > 0) {
int remaining = stock.decrementAndGet();
if (remaining >= 0) {
System.out.println(Thread.currentThread().getName() + " 秒杀成功,剩余库存: " + remaining);
} else {
System.out.println(Thread.currentThread().getName() + " 秒杀失败,库存不足");
}
} else {
System.out.println(Thread.currentThread().getName() + " 秒杀失败,库存不足");
}
}).start();
}
}
}本题详细解读
1. 问题分析
秒杀系统的核心问题在于高并发场景下的库存管理。多个用户同时请求秒杀时,系统需要确保库存的准确性和一致性,避免超卖或库存不一致的问题。
2. 解决方案
- 使用原子操作:通过
AtomicInteger来管理库存,确保在多线程环境下库存的增减操作是原子的,避免并发问题。 - 库存检查:在秒杀前检查库存是否大于0,如果库存充足则进行秒杀操作,否则返回秒杀失败。
- 库存扣减:使用
decrementAndGet()方法原子地减少库存,并返回扣减后的库存值。
3. 代码实现
- 库存初始化:
MAX_STOCK定义了最大库存量,stock是一个AtomicInteger类型的变量,用于存储当前库存。 - 多线程模拟:通过创建多个线程来模拟并发秒杀请求。
- 库存扣减逻辑:每个线程在秒杀前检查库存,如果库存充足则进行扣减,并输出秒杀结果。
4. 注意事项
- 性能优化:在实际生产环境中,可能需要考虑更多的性能优化措施,如使用分布式锁、缓存等。
- 异常处理:代码中未处理异常情况,实际应用中需要考虑异常处理机制。
- 扩展性:此示例为简单实现,实际秒杀系统可能需要考虑更多的业务逻辑和扩展性设计。