代码如下
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;
public class MyLock {
//用来表示当前线程是否获取锁 0 无锁 1 有锁
// private volatile int state;
private volatile static AtomicInteger state = new AtomicInteger(0);
private Thread ownerThread;
private volatile Queue<Thread> queue = new LinkedBlockingQueue<>();
public void lock(){
//如果当前state为0 则可以将state和当前线程绑定
Thread thread = Thread.currentThread();
if(state.compareAndSet(0,1)){
ownerThread = thread;
}else{
for (;;){
//挂起前 尝试再次获取
if(state.compareAndSet(0,1)){
ownerThread = thread;
return;
}
if(queue.add(thread)){
//挂起
LockSupport.unpark(thread);
LockSupport.park();
}
}
}
}
/**
* 解锁
*/
public void unlock(){
if(state.compareAndSet(1,0)){
ownerThread = null;//help GC
Thread peek = queue.peek();
if(peek != null){
Thread head = queue.poll();
LockSupport.unpark(head);
}
}
}
}