CAS(CompareAndSet)顾名思义,比较进行更新,总的来说就是再更新值得时候需要判断一些原先值是否是预期值,是则更新,不是则更新失败
public class SpinLock {
private static AtomicReference<Thread> atomicThread = new AtomicReference<>(); // 初始值为null
public void lock() {
Thread thread = Thread.currentThread();
// 自选获取锁 当初始值与期望值相同时, 则更新
while (!atomicThread.compareAndSet(null, thread)) {
System.out.println(thread.getName() + "尝试获取锁");
}
System.out.println(thread.getName() + "获取到锁");
}
public void unLock() {
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + "释放锁");
atomicThread.compareAndSet(thread, null);
}
private static volatile int count = 0;
public static void main(String[] args) {
SpinLock spinLock = new SpinLock();
new Thread(() -> {
spinLock.lock();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
spinLock.unLock();
}
}).start();
new Thread(() -> {
spinLock.lock();
try {
// do something
} finally {
spinLock.unLock();
}
}).start();
}
}