适应性自旋 (adaptive spinning)
在JUC中我们经常会用到自旋锁,什么是自旋锁呢?
让当前线程进行自旋(相当于在while语句中不停的执行去获取资源),如果在自旋完成后前面锁定同步资源的线程已经释放了锁,那么当前线程就可以不必阻塞而是直接获取同步资源,从而避免切换线程的开销,这就是自旋锁。
通过对自旋锁的理解我们大概知道了其工作方式,虽然自旋锁是非阻塞的,但是并非所有情况自旋锁都是一种最优解。自旋等待虽然避免了线程切换的开销,但它要占用处理器时间(因为线程自旋相当于一直在while语句中执行,CPU资源就会被一直占用)。如果锁被占用的时间很短,自旋等待的效果就会非常好。反之,如果锁被占用的时间很长,那么自旋的线程也会浪费掉处理器资源。
适应性自旋又是什么呢?
适应性自旋即自旋的时间(次数)不再固定,根据获取到锁资源的频次和概率增加自旋时间或者省略自旋。
偏向锁 (biased locking)
偏向锁是虚拟机中的一种优化技术。是指线程经常性的重新获取锁,在当前线程连续获取该锁的情况下,该锁资源就会产生偏向让该线程已更小的开销来获取锁资源。当其他线程要获取该锁资源,必须要等锁偏向的线程撤销锁偏向(释放锁)。