ReentrantLock作为一个jdk层面的锁,实现了lock接口,在自定义自己的reentrantLock时只需要重写tryacquire获取许可方法,tryRelease尝试释放锁逻辑方法,isHeldExclusively判断是否被占用,其中一个很重要的方法getState和setState方法中一个很重要的变量state,0代表无锁,1代表有锁。只需要判断这个信号量就可以判断线程状态。
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; public class MyReentrantLock implements Lock { public static class Sync extends AbstractQueuedSynchronizer{ protected boolean tryacquire(int arg) { int state = getState(); //如果state为0表示无锁,1表示有锁 //第一次加锁 if(compareAndSetState(0,1)){ setExclusiveOwnerThread(Thread.currentThread()); return true; } //如果当前线程与占用的线程一致,表明线程重入 if(Thread.currentThread() == getExclusiveOwnerThread()){ compareAndSetState(state,state+1); return true; } return false; } protected boolean tryRelease(int args){ //只有一个线程的时候会进入 int state = getState(); //进行减1操作 setState(state-1); //如果为0则表示当前线程无锁将其置为null if(state == 0){ setExclusiveOwnerThread(null); } return true; } /** * 判断是否被占用 */ protected boolean isHeldExclusively(){ return getState()>0; } } private Sync sync = new Sync(); @Override public void lock() { sync.acquire(1); } @Override public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } @Override public boolean tryLock() { return sync.tryacquire(1); } @Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException { return tryLock(); } @Override public void unlock() { sync.release(1); } @Override public Condition newCondition() { return null; } }