提交 8700c1e1 编写于 作者: 武汉红喜's avatar 武汉红喜

concurrent test

上级 3b68deb9
package org.hongxi.java.util.concurrent;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.LockSupport;
/**
* @author shenhongxi 2019/09/01
* 公平(先进先出)互斥锁
*/
public class FIFOMutex {
private final AtomicBoolean locked = new AtomicBoolean(false);
private final Queue<Thread> waiters = new ConcurrentLinkedQueue<>();
public void lock() {
boolean wasInterrupted = false;
Thread current = Thread.currentThread();
waiters.add(current);
// 只有队首的线程可以获取锁
while (waiters.peek() != current || !locked.compareAndSet(false, true)) {
LockSupport.park(this);
if (Thread.interrupted())
wasInterrupted = true;
}
waiters.remove();
if (wasInterrupted)
current.interrupt();
}
public void unlock() {
locked.set(false);
LockSupport.unpark(waiters.peek());
}
}
......@@ -4,6 +4,7 @@ import java.util.concurrent.locks.LockSupport;
/**
* @author shenhongxi 2019/8/13
* @see FIFOMutex
*/
public class LockSupportTest {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册