1.考查是否知道并发编程AQS
知道AQS吗?能否介绍下,它的核心思想是什么
你知道的AQS有几种同步方式,实现同步器一般要覆盖哪些方法
注意:线程获取锁成功后直接返回,不会进入等待队列里面,只有失败的时候才会
//线程获取锁成功后 直接返回,不会进入等待队列里面,只有失败的时候才会
public final void acquire(int arg) {
if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
=========
//获取失败则将当前线程封装为Node.EXCLUSIVE的Node节点插入AQS阻塞队列的尾部
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}
==================
//调用LockSupport.park(this)方式阻塞自己
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}