锁优化(1)---自旋锁与自适应自旋

自旋锁

互斥同步对性能的最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成。

为了避免在共享资源时,线程的频繁挂起和恢复,可以让原本需要等待的线程执行一个忙循环(自旋),说白了就是让它“原地踏步”,自己发会呆,这就是所谓的自旋锁

在JDK1.6之后,自旋锁是默认开启的,适用于锁被占用时间很多的情况,反之自旋的线程只会白白消耗处理器资源,反而带来了性能上的浪费。所以自旋等待的时间必须有一定的限度,超过了限定的次数仍然没有成功获取锁,就应当使用传统的方式挂起线程了。自旋次数的默认值是10,用户可以通过-XX:PreBlockSpin来更改。

自适应自旋锁

自适应自旋锁的自适应反映在自旋的时间不在固定了。如果在同一个锁对象上,自旋线程之前刚刚获得过锁,且现在持有锁的线程正在运行中,那么虚拟机会认为这次自旋也很有可能会成功,进而允许该线程等待持续相对更长的时间,比如100个循环。反之,如果某个锁自旋很少获得过成功,那么之后再获取锁的时候将可能省略掉自旋过程,以避免浪费处理器资源。

你可能感兴趣的:(锁优化(1)---自旋锁与自适应自旋)