关于java:Java压测出现数量击穿

32次阅读

共计 534 个字符,预计需要花费 2 分钟才能阅读完成。

问题场景形容:
对选课零碎接口进行压测,发现呈现选课数量击穿问题。设置好的课程数量一般测试时候,并不会呈现问题,但并发测试的时候呈现了课程超选的问题,选课数量呈现了正数,超过选课数量的人选到了课程。

设置的是模仿 20 位用户抉择,数量只有 5 个的课程。测试后果 20 名用户都选到了课程,课程数量变为 -15 个。

问题剖析:
以下是选课的外围逻辑代码,以下代码并不是线程平安的,当呈现高并发时候,会呈现等值击穿问题和数据不统一的问题。当一个线程还在查是否有课程时候,另一个线程曾经将数据减一了,所以必须加锁。

问题解决
在代码处退出 synchronized 关键字,对须要同步的代码进行加锁,来保障线程一一执行。

测试后果是数据库也保障了只用 5 个用户选到了课程。

问题总结与思考
1、synchronized 加锁在保障代码正确的状况下,尽量保障粒度细一些,锁的代码少一点。
2、在进行相似的等值判断是否减到 0 的场景中,要用小于 0 来进行判断,如果用等于号,万一等值击穿将会一发不可收拾。
3、synchronized 加锁在大量申请争抢锁的状况下,而解决工夫工夫又比拟长,会呈现锁降级的状况,大量降级为重量级锁将会导致系统性能降落。
4、也能够思考用 ReetrantLock 锁和数据库层面进行加锁,进行优化。

正文完
 0