Cas自旋锁
有a,b两个人需要去一个带密码锁的房子做任务,ab都知道默认密码,a到门口输入密码打开门,并修改密码,此时b也到门口,输入密码,但是密码被a修改,b只能在门口一直转圈(自旋)等待,等a完成任务出来,a将密码锁的密码修改为原密码,此时b如果还没有离开(自旋的最大等待时间),输入密码,并将密码修改为新密码,进去完成任务,b出来将密码修改为回来。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class SpinlockDemo {
AtomicReference<Thread> atomicReference =
new AtomicReference<>();
public void myLock() {
Thread thread = Thread.currentThread();
System.out.println(thread.getName()
+ "==> 去获取锁");
while (!atomicReference.compareAndSet(null, thread)) {
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getName() + "在自旋");
}
}
public void myUnLock() {
Thread thread = Thread.currentThread();
System.out.println(Thread.currentThread().getName()
+ "==> 释放锁");
atomicReference.compareAndSet(thread, null);
}
}
class TestSpinLock {
public static void main(String[] args) throws
InterruptedException {
SpinlockDemo lock = new SpinlockDemo();
new Thread(() -> {
lock.myLock();
try {
System.out.println("t1执行任务");
TimeUnit.SECONDS.sleep(7);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.myUnLock();
}
}, "T1").start();
TimeUnit.SECONDS.sleep(1);
new Thread(() -> {
lock.myLock();
try {
System.out.println("t2执行任务");
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.myUnLock();
}
}, "T2").start();
}
}
ABA问题:
这次一共来了三个人abc,ab知道默认密码是123,c不知道,a修改密码为321,b因为走的慢,所以c先到门口,c恰好输入密码321,并将密码修改为123,这时b到了,输入密码123,就造成abc全进去,大家都无法完成任务。