什么是自旋锁
当cpu正在访问获取到自选锁的临界区,让其他也需要访问该临界区的,但并未获得锁的线程忙等待,而不是像可重入锁一样阻塞,所以自选锁是一种针对多cpu的非阻塞锁
public class SpinLock {
private AtomicReference<Thread> 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<Thread> 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,忙等待直到其他线程改变。