之前我在文章 源码解读java 并发包 AQS中已经讲过了,实现锁的功能,必须继承AQS类,重写父类的 tryAcquire,tryRelease或者tryAcquireShared,tryReleaseShared 的方法,自定义的锁也非常简单,内部定义一个Sync类继承AQS就行,看代码
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class Mux {
// 自定义同步器
private static class Sync extends AbstractQueuedSynchronizer{
// 判断是否锁定状态
@Override
protected boolean isHeldExclusively() {
return getState()==1;
}
// 尝试获取资源,立即返回。成功则返回true,否则false。
@Override
protected boolean tryAcquire(int arg) {
int c = getState();
if(c==0){
if (compareAndSetState(0, 1)) {//state为0才设置为1,不可重入!
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
}
return false;
}
@Override
protected boolean tryRelease(int arg) {
int c=getState();
if(c==1){
setState(0);
setExclusiveOwnerThread(null);
return true;
}
return false;
}
}
public Mux(){
sync = new Sync();
}
private Sync sync;
public void lock(){
sync.acquire(1);
}
public void unlock(){
sync.release(1);
}
public boolean tryLock(){
return sync.tryAcquire(1);
}
}