- AQS全名为AbstractQueuedSynchronizer ,它是阻塞式锁和相关同步工具的框架
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer
implements Serializable
- 用state属性来表示资源的状态(分为独占式和共享式),子类需要定义和维护这个状态,控制如何获取锁和维护锁。
getState:获取状态 setState:设置状态 compareAndSetState:CAS的机制来设置状态
独占式:允许一个线程访问资源 共享式:允许多个线程访问资源 - 提供FIFO等待队列,类似于Monitor的EntryList
- 条件变量来实现等待,唤醒机制,支持多个条件变量,类似于Monitor的WaitSet
利用AQS实现自定义不可重入锁
class Mylock implements Lock{
private Mysync mysync=new Mysync();
class Mysync extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int arg) {
if (compareAndSetState(0,1)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
@Override
protected boolean isHeldExclusively() {
return getState()==1;
}
}
@Override
public void lock() {
mysync.acquire(1);
}
@Override
public void lockInterruptibly() throws InterruptedException {
mysync.acquireInterruptibly(1);
}
@Override
public boolean tryLock() {
return mysync.tryAcquire(1);
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return false;
}
@Override
public void unlock() {
mysync.release(0);
}
@Override
public Condition newCondition() {
return newCondition();
}
}
public class Demo2 {
public static void main(String[] args) {
String s="nihao";
Mylock mylock=new Mylock();
new Thread(()->{
mylock.lock();
try{
System.out.println(s);
}finally {
}
}).start();
new Thread(()->{
mylock.lock();
try{
System.out.println(s);
}finally {
}
}).start();
}
}