当前位置: 首页 > news >正文

miqiu的分布式锁(二):实战——用JMeter验证JVM锁能否解决MySQL超卖问题

miqiu的分布式锁二:实战——用JMeter验证JVM锁能否解决MySQL超卖问题

实验背景

在秒杀场景中,超卖问题是典型的并发编程挑战。本文通过JMeter压测工具,验证基于JVM的两种锁机制(synchronized/ReentrantLock)对MySQL库存操作的防护效果。


实验一:内存库存操作验证

1.1 无锁场景

public void deduct() {
    stock.setStock(stock.getStock() - 1);
    System.out.println("库存余量:" + stock.getStock());
}

压测结果(100线程×50次循环):

  • 平均响应时间:3ms
  • 吞吐量:2217/sec
  • 最终库存:-89(严重超卖)

无锁压测报告


1.2 synchronized锁方案

public synchronized void deduct() {
    stock.setStock(stock.getStock() - 1);
    System.out.println("库存余量:" + stock.getStock());
}

压测结果对比

  • 平均响应时间 ↗ 25ms(733%增长)
  • 吞吐量 ↘ 396/sec(82%下降)
  • 最终库存 ✅ 0(完美解决)

同步锁压测报告


1.3 ReentrantLock方案

private final ReentrantLock lock = new ReentrantLock();

public void deduct() {
    lock.lock();
    try {
        stock.setStock(stock.getStock() - 1);
        System.out.println("库存余量:" + stock.getStock());
    } finally {
        lock.unlock();
    }
}

性能表现

  • 平均响应时间:22ms
  • 吞吐量:440/sec
  • 最终库存 ✅ 0

重入锁压测报告


实验二:真实MySQL库存操作

2.1 无锁数据库操作

public void deduct() {
    Stock stock = stockMapper.selectByProductCode("1001");
    if(stock != null && stock.getCount() > 0) {
        stock.setCount(stock.getCount() - 1);
        stockMapper.updateById(stock);
    }
}

压测结果

  • 平均响应时间:249ms
  • 吞吐量:394/sec
  • 最终库存:4900(严重超卖)

数据库无锁压测


2.2 ReentrantLock防护方案

private final ReentrantLock lock = new ReentrantLock();

public void deduct() {
    lock.lock();
    try {
        Stock stock = stockMapper.selectByProductCode("1001");
        if(stock != null && stock.getCount() > 0) {
            stock.setCount(stock.getCount() - 1);
            stockMapper.updateById(stock);
        }
    } finally {
        lock.unlock();
    }
}

验证结果

  • 平均响应时间 ↗ 623ms(151%增长)
  • 吞吐量 ↘ 158/sec(60%下降)
  • 最终库存 ✅ 0(正确扣减)

数据库锁压测


关键结论

  1. 防护有效性
    JVM级锁能有效解决单机部署下的超卖问题,确保库存操作的原子性

  2. 性能代价
    synchronized/ReentrantLock均造成吞吐量显著下降,响应时间成倍增加

  3. 架构局限

    • 仅适用于单服务实例场景
    • 分布式部署时不同JVM实例的锁相互不可见
    • 数据库连接池耗尽风险(长时间持锁)

后续方向

通过本实验验证了JVM锁的单机有效性,但分布式场景需要更强大的锁机制。下一篇将研究jvm锁的失效情况

相关文章:

  • element-ui的组件使用
  • 每日一题——字母异位词分组
  • 2024 年出现的 11 大数据收集趋势
  • spring boot 连接FTP实现文件上传
  • linux中根目录满了
  • C#开发的Base64编码及解码完整源码及注意事项
  • 【含开题报告+文档+PPT+源码】基于大数据的交通流量预测系统
  • 论软件设计模式及其应用-软考
  • 【算法】797. 差分
  • C语言番外篇(4)--------->goto语句
  • 如何进行OceanBase 运维工具的部署和表性能优化
  • Linux 内核配置机制详细讲解
  • 【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
  • 【由技及道】模块化战争与和平-论项目结构的哲学思辨【人工智智障AI2077的开发日志】
  • 【c++】【线程池】固定式线程池(FixedThreadPool)
  • 解锁C# XML编程:从新手到实战高手的蜕变之路
  • Document对象
  • 【组态PLC】基于西门子S7-200和博图V16和组态王十层起重机电梯设计【含PLC组态源码 M018期】
  • 什么是 Java 中的线程安全?
  • 使用前端 html css 和js 开发一个AI智能平台官网模板-前端静态页面项目
  • 广州番禺疫情/百度seo按天计费
  • 做b2c网站多少钱/关键词在线听
  • 电子商务服务网站/旺道seo优化
  • 网站备案变更 能让首页关闭 二级域名继续/2024年重大政治时事汇总
  • 网站的数据库空间价格/公司宣传软文
  • 网站建设yankt/小红书搜索指数