信号量限流测试和一些问题分析

semaphore.acquire()semaphore.tryAcquire(1, TimeUnit.SECONDS) 对比

代码参见

https://github.com/doctording/springboot_gradle_demos/pull/1/files

jmeter 测试

在这里插入图片描述
在这里插入图片描述

虽然我们的接口耗时只有100ms,实际的执行时间,却长的多

有大量的线程处于饿死的状态,没有失败的

在这里插入图片描述

如上图,很多线程是驻留状态,waiting on condition,获取锁获取了很久,不过最后是获取到了

线程饥饿概念:如果一个线程因为 CPU 时间全部被其他线程抢走而得不到 CPU 运行时间,这种状态被称之为饥饿

线程状态回顾

线程的五种状态

  • 新建:new(时间很短)

  • 运行:runnable

  • 等待:waiting(无限期等待),timed waiting(限期等待)

  • 阻塞:blocked

  • 结束:terminated(时间很短)

Java VisualVm 给出的可视化线程状态,对应关系如下表
在这里插入图片描述

VisualVm 线程状态 Java 线程状态
运行 RUNNABLE
休眠 TIMED_WAITING (sleeping)
等待 WAITING (on object monitor), TIMED_WAITING (on object monitor)
驻留 WAITING (parking),TIMED_WAITING (parking)
监视 BLOCKED (on object monitor)

使用 tryAcquire 将成功请求控制在一个合理的响应时间

在这里插入图片描述
一定时间内tryAcquire失败给出相应的返回
在这里插入图片描述

参考

http://developer.51cto.com/art/201907/600469.htm
https://www.cnblogs.com/trust-freedom/p/6606594.html

发布了441 篇原创文章 · 获赞 110 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/99291034