Java自旋锁和自适应自旋
2020-05-25 本文已影响0人
cbhe
java程序的每个线程都是跟物理机的内核态线程是一一对应的。因此线程的挂起和恢复都需要转入内核态来完成。因此java线程阻塞的实现实际上就是对java多线程互斥同步性能影响最大的地方。
问题:线程同步非常消耗资源,尤其是线程阻塞
可行方案:能否让线程在等待锁的时候不阻塞,而是轮询检查锁是否可用
在某些情况下,轮询检查确实比线程阻塞更加划算。例如,许多时候当前线程等待一个很短的时间就可以获得锁,这时就可以不挂起而是轮询一会。但轮询是要占用cpu资源的,所以轮询的时间不能太长,否则这段时间内线程什么都没做还浪费了cpu资源,肯定不划算。
问题:虽然有时候使用轮询可以避免阻塞减少资源浪费,但是如何设置轮询的时间呢?太短不行,太长也不行。
可行方案:让虚拟机来做个统计。然后自适应应用自旋。
如果过去一段时间等待某个锁所需的时间都很短,那么就把这个锁等待的方式从阻塞改为自旋。如果自旋获取锁的成功率不高,那就直接改成阻塞方式吧,毕竟每次自旋都是存粹浪费cpu。