是一个抽象的基于队列的同步器。
aqs是阻塞式的锁。
锁池和等待池:https://blog.csdn.net/emailed/article/details/4689220
EntryList:http://blog.sina.com.cn/s/blog_c038e9930102v2i0.html
---08-- 101 -
解锁:
看下这个release方法:
tryRelease,不会唤醒阻塞的线程。
代码:
package cn.itcast.n8;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import static cn.itcast.n2.util.Sleeper.sleep;
@Slf4j(topic = "c.TestAqs")
public class TestAqs {
public static void main(String[] args) {
MyLock lock = new MyLock();
new Thread(() -> {
lock.lock();
try {
// log.debug("locking...");
sleep(1);
} finally {
// log.debug("unlocking...");
lock.unlock();
}
},"t1").start();
new Thread(() -> {
lock.lock();
try {
// log.debug("locking...");
} finally {
// log.debug("unlocking...");
lock.unlock();
}
},"t2").start();
}
}
// 自定义锁(不可重入锁)
class MyLock implements Lock {
// 独占锁 同步器类
class MySync extends AbstractQueuedSynchronizer {
@Override
protected boolean tryAcquire(int arg) {
// 为什么是cas的呢?其他的线程也会尝试去加锁的
if(compareAndSetState(0, 1)) {
// 加上了锁,并设置 owner 为当前线程
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;
}
public Condition newCondition() {
return new ConditionObject();
}// 条件变量
}
private MySync sync = new MySync();
@Override // 加锁(不成功会进入等待队列)1和0应该是公平和非公平 tryAcquire
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 sync.tryAcquireNanos(1, unit.toNanos(time));
}
@Override // 解锁
public void unlock() {
sync.release(1);
}
@Override // 创建条件变量
public Condition newCondition() {
return sync.newCondition();
}
}
state和condition都是aqs类里面的。
---08--102-
首先我们要确定下为什么要重写这些方法,是因为这个实现是分很多实现的,我们只是自己的实现而已。
测试自定义锁。
不可重入:本线程加锁,下次再加锁就进不去了。
---08--103-