JUC中的AQS底层详细超详解( 六 )


ReentrantLock释放时 , 也会处理重入 , 关键点就是对getState() - release后的处理 , 是否返回true或者false
protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { // 只有资源数为0才会解锁 // 才算释放成功 , 否则这锁还是占住了free = true; setExclusiveOwnerThread(null); } setState(c); return free;}AQS如何响应超时AQS提供的方法中带有Nanos后缀的方法就是支持超时中断的方法 。
核心逻辑就是每次阻塞前 , 确认nanosTimeout是否已经超时了 。
每次唤醒时 , 将nanosTimeout减去阻塞所花的时间 , 重新确认 , 并修改lastTime
关键部分见下图

JUC中的AQS底层详细超详解

文章插图
spinForTimeoutThreshold是什么?首先这个值是写死的1000L即1000纳秒
1000纳秒是个非常小的数字 , 而小于等于1000纳秒的超时等待 , 无法做到十分的精确 , 那么就不要使用这么短的一个超时时间去影响超时计算的精确性 , 所以这时线程不做超时等待 , 直接做自旋就好了 。
点击关注 , 第一时间了解华为云新鲜技术~
【JUC中的AQS底层详细超详解】

经验总结扩展阅读