1.自旋锁

        一般来说,对象锁的锁状态持续时间较短时。频繁的唤醒和挂起线程是非常不值得的。因此而引入自旋锁的概念。
        自旋锁就是让线程不被阻塞,然后等待线程释放锁。那么自旋锁如何保证线程不被挂起呢?那就是使线程一直运行,即执行无意义的循环即可。😂

        但是自旋等待不能替代阻塞,先不说对处理器数量的要求(多核),虽然它可以避免线程切换带来的开销,但是它占用了处理器的时间。如果持有锁的线程很快就释放了锁,那么自旋的效率就非常好,反之,自旋的线程就会白白消耗掉处理的资源,它不会做任何有意义的工作,这样反而会带来性能上的浪费。所以在线程自旋的时候,应当限制其自旋的最大次数。下面来说说自适应的自旋锁。

2.适应自旋锁

        所谓自适应就意味着自旋的次数不再是固定的,它是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。那么它是如何工作的?
  • 线程如果自旋成功了,那么下次自旋的次数会更加多,因为虚拟机认为既然上次成功了,那么此次自旋也很有可能会再次成功,那么它就会允许自旋等待持续的次数更多。
  • 反之,如果对于某个锁,很少有自旋能够成功的,那么在以后要或者这个锁的时候自旋的次数会减少甚至省略掉自旋过程,以免浪费处理器资源。