对应的方法为tryAcquireNanos,尝试获取有超时时间的锁,注意:Nanos代表的是纳秒
参数里面有一个arg,这个参数是传给tryAcquire与doAcquireNanos的,而在doAcquireNanos中只有调用tryAcquire时候才会使用到这个参数,所以这个参数是在实现tryAcquire时再考虑有什么作用的,还有一个参数为nanosTimeout,这个其实就是超时的时间(以纳秒为单位)
方法的具体步骤如下
-
先判断线程是否被中止了
-
如果被中止,抛出异常,方法结束
-
如果没有被中止
-
调用tryAcquire方法去尝试获得锁(这个方法是AQS没有实现的,要锁去具体实现)
-
如果获得锁失败了,才会调用doAcquireNanos方法,这个方法就是超时等待实现的细节
doAcquireNanos
这里先贴上源码
private boolean doAcquireNanos(long arg, long nanosTimeout)
throws InterruptedException {
//判断设置的超时时间是否正确
//如果不正确,直接返回false
//那么上一层的tryAcquirenano方法整体就会返回false
//那么就不可以继续执行下去了
if (nanosTimeout <= 0L)
return false;
//计算获取锁的限制时间
//超过这个时间就不可以获取了
//System.nanoTime是一个本地方法,用来获取虚拟机时间的,精确到纳秒级别
//所以传进来的nanosTimeout必须为纳秒级别
// 1秒 = 10^9纳秒,十亿份之一
//这也是为什么使用long类型
final long deadline = System.nanoTime() + nanosTimeout;
//因为没抢到锁,所以要将该线程加入到队列里面
//并且nextWaiter为Exclusive,代表该结点线程状态是独占式的
final Node node = addWaiter(Node.EXCLUSIVE);
//failed变量记录过程是否出错
boo