使用LockSupprt 中park、unpark() 实现一个简单的先进先出锁
/**
* @Version :
* @Description : 先进先出锁
*/
public class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> writers = new ConcurrentLinkedQueue<>();
public void lock() {
Thread current = Thread.currentThread();
writers.add(current);
boolean wasInterrupted = false;
// 此时判断队首线程是否是当前线程或者其他线程持有当前锁,则挂起自己
while (writers.peek() != current || locked.compareAndSet(false, true)) {
LockSupport.park(this);
// 如果当前线程被其他线程中断
if (current.isInterrupted()) {
wasInterrupted = true;
}
}
writers.remove();
// 标识该线程中断,对其他线程的可见性,其他线程对该中断信号感兴趣
if (wasInterrupted) {
current.interrupt();
}
}
public void unlocked() {
locked.set(false);
// 给队列第一个元素许可证
LockSupport.unpark(writers.peek());
}
}