- AQS是抽象同步队列,AQS中实现了各种锁的逻辑,因此我们可以继承AQS来实现自定义同步器。
- 自定义AQS需要重写一系列函数,还需要定义原子变量state的含义。在自定义同步器中state为0表示锁没有被线程持有,state为1表示锁已经被一个线程持有。
以下是基于AQS实现的不可重入的独占锁。
/**
* @author admin
*/
public class NonReentrantLock implements Lock, Serializable {
protected static class Sync extends AbstractQueuedSynchronizer{
//是否锁已经被持有
@Override
protected boolean isHeldExclusively(){
return getState() == 1;
}
//如果state为0,则尝试获得锁
@Override
public boolean tryAcquire(int acquires){
assert acquires == 1;
if (compareAndSetState(0,1)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
//尝试释放锁,设置state为0
@Override
protected boolean tryRelease(int release){
assert release == 1;
if (getState() == 0){
throw new IllegalMonitorStateException();
}
setExclusiveOwnerThread(null);
setState(0);
return true;
}
//提供条件变量接口
Condition newCondition(){
return new ConditionObject();
}
}
private final Sync sync = new Sync();
@Override
public void lock() {
sync.acquire(1);
}
@Override
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
}
public boolean isLocked(){
return sync.isHeldExclusively();
}
@Override
public boolean tryLock() {
return sync.tryAcquire(1);
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return sync.tryAcquireNanos(1,unit.toNanos(time));
}
@Override
public void unlock() {
sync.release(1);
}
@Override
public Condition newCondition() {
return sync.newCondition();
}
}
在如上代码中,NonReentrantLock定义了一个内部类Sync用来实现具体的锁的操作,Sync则继承了AQS。由于实现的独占锁模式的锁,所以Sync重写了tryAcquire、tryRelease、isHeldExclusively三个方法。另外Sync提供了newCondition这个方法用来支持条件变量。