自旋锁

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其他线程所获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环,获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。
与互斥锁不同,互斥锁会导致线程睡眠,而自旋锁不会睡眠。

自旋锁存在的问题

  1. 如果某个线程持有锁的时间过长,就会导致其他等待获取锁的线程陷入循环等待,消耗CPU,使用不当会造成CPU使用率极高。
  2. 不公平的锁可能会导致线程饥饿问题。

    自旋锁的优点

  3. 自旋锁不会使线程状态发生改变,即线程不会睡眠,即不会进行内核态与用户态的转变,不会发生线程间切换,执行速度快。

  4. 非自旋锁会导致线程间切换,严重影响锁的性能。

    可重入与不可重入

    使用一个计数量来记录当前锁被获取重数,在被释放时也要释放对应的重数。