1、什么是自旋
所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的。锁在原地循环的时候,是会消耗cpu的,就相当于在执行一个啥也没有的for循环。
自旋其实就是在当前这个线程获取同步资源锁失败的时候,该线程会在原地一直等待锁释放,不会把该线程阻塞,只要获得锁的那个线程释放锁之后,这个等待的线程马上就可以去获得锁。原地循环等待会占用处理器时间的,类似在执行一个空的for循环一样。
2、非自旋锁
非自旋锁尝试获取同步资源锁失败,会阻塞再唤醒一个Java线程。互斥锁就是一种非自旋锁。
我们通过一个打水的图来梳理一下非自旋锁竞争资源的流程:
3、自旋锁
在有些时候,同步代码块中的内容比较简单,状态转换消耗的时间有可能比用户代码执行的时间还要长,想想就像为了吃个方便面,要让我到五公里远的小卖部接热水一样,得不偿失。
如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,我们就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。
而为了让当前线程