目录
步骤1:自定义同步器
package xiancheng.AQSsuo;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
//重写AQS的方法 - 自定义同步器
public class Mysyn extends AbstractQueuedSynchronizer {
@Override
protected boolean tryAcquire(int acquires) {
if (acquires == 1){
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
}
return false;
}
@Override
protected boolean tryRelease(int acquires) {
if(acquires == 1) {
if(getState() == 0) {
throw new IllegalMonitorStateException();
} setExclusiveOwnerThread(null); setState(0);
return true;
}
return false;
}
protected Condition newCondition() {
return new ConditionObject();
}
@Override
protected boolean isHeldExclusively() {
return getState() == 1;
}
}
步骤2:自定义锁
package xiancheng.AQSsuo;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
//自定义锁 - 实现不可重入
public class Mylock implements Lock {
static Mysyn mysyn = new Mysyn();
@Override
public void lock() {
mysyn.acquire(1);
}
@Override
public void lockInterruptibly() throws InterruptedException {
mysyn.acquireInterruptibly(1);
}
@Override
public boolean tryLock() {
return mysyn.tryAcquire(1);
}
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return mysyn.tryAcquireNanos(1, unit.toNanos(time));
}
@Override
public void unlock() {
mysyn.release(1);
}
@Override
public Condition newCondition() {
return mysyn.newCondition();
}
}
步骤3:测试
package xiancheng.AQSsuo;
import static java.lang.Thread.sleep;
public class Testlock {
public static void main(String[] args) {
Mylock lock = new Mylock();
new Thread(() -> {
lock.lock();
try {
//log.debug("locking...");
//会出错,不可重入
lock.lock();
sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//log.debug("unlocking...");
lock.unlock();
}
},"t1").start();
}
}