自旋锁和可重入锁

什么是自旋锁

当cpu正在访问获取到自选锁的临界区,让其他也需要访问该临界区的,但并未获得锁的线程忙等待,而不是像可重入锁一样阻塞,所以自选锁是一种针对多cpu的非阻塞锁

public class SpinLock {

  private AtomicReference sign =new AtomicReference<>();

  public void lock(){
    Thread current = Thread.currentThread();
    while(!sign .compareAndSet(null, current)){
    }
  }

  public void unlock (){
    Thread current = Thread.currentThread();
    sign .compareAndSet(current, null);
  }
}

自旋锁

public class SpinLock {
    private AtomicReference owner =new AtomicReference<>();
    public void lock(){
        Thread current = Thread.currentThread();
        while(!owner.compareAndSet(null, current)){
        }
    }
    public void unlock (){
        Thread current = Thread.currentThread();
        owner.compareAndSet(current, null);
    }
}

AtomicReference

Java多线程系列--“JUC原子类”04之 AtomicReference原子类

自旋锁死锁

如果锁占有的代码,和占有cpu的代码(需要访问临界区获取自旋锁)在同一个处理机上,则会产生死锁,占有锁因为得不到时间片,始终释放不了锁。

可重入锁

锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

自旋锁和可重入锁

如果抢占锁的时间比较短暂,cpu会切换线程上下文,消耗性能,这时自旋锁就比较合适了,不会释放cpu,忙等待直到其他线程改变。

你可能感兴趣的:(自旋锁和可重入锁)