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