锁专题(五)ReentrantLock 深入源码详解( 三 )


个人的理解是这里的尝试获取锁就只有一次 , 虽然破坏了公平性呢 , 但是性能很好 , 常常是更符合使用者预期的 。
ps: 这里不得不感慨一下 , 有些东西不看源码 , 是想不到的 。

  • 我们想使用公平模式获取锁怎么办?

锁专题(五)ReentrantLock 深入源码详解文章插图
公平
那问题又来了 , 我们想使用公平锁模式获取锁怎么办?
我们可以使用 tryLock(0, TimeUnit.SECONDS) 这个方法公平的获取锁 。
tryLock(long timeout, TimeUnit unit)指定超时时间的获取锁方法 , 系统会统一转换为 nanos 去处理 。
public boolean tryLock(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(timeout));}
  • 纳秒是多久?
ns(nanosecond):纳秒 , 时间单位 。 一秒的十亿分之一 , 等于10的负9次方秒(1 ns = 10 s) 。
光在真空中一纳秒仅传播0.3米 。 个人电脑的微处理器执行一道指令(如将两数相加)约需2至4纳秒 。
  • tryAcquireNanos
/** * @author 老马啸西风 */public final boolean tryAcquireNanos(int arg, long nanosTimeout)throws InterruptedException {if (Thread.interrupted())throw new InterruptedException();return tryAcquire(arg) ||doAcquireNanos(arg, nanosTimeout);}可以看出这个方法同样支持中断 。
/** * Acquires in exclusive timed mode. * * @param arg the acquire argument * @param nanosTimeout max wait time * @return {@code true} if acquired * @author 老马啸西风 */private boolean doAcquireNanos(int arg, long nanosTimeout)throws InterruptedException {if (nanosTimeout <= 0L)return false;final long deadline = System.nanoTime() + nanosTimeout;final Node node = addWaiter(Node.EXCLUSIVE);boolean failed = true;try {for (;;) {final Node p = node.predecessor();if (p == headp.next = null; // help GCfailed = false;return true;}nanosTimeout = deadline - System.nanoTime();if (nanosTimeout <= 0L)return false;if (shouldParkAfterFailedAcquire(p, node)if (Thread.interrupted())throw new InterruptedException();}} finally {if (failed)cancelAcquire(node);}}方法执行的时候设置了一个 deadline , 有一句话怎么说来着 。
deadline 是第一生产力 , 可能对于锁而言也是如此吧 。
unlock()释放锁 。
public void unlock() {sync.release(1);}
  • release()
这里会调用 tryRelease , 如果成功还会有一些 Node 信息的更新 。
/** * @author 老马啸西风 */public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;if (h != nullreturn true;}return false;}其他还有一些方法 , 我们平时也不常用 , 此处就不做重点解析 。
小结锁作为我们高性能并发中并发安全的基础 , 是每一位 java 程序员的必备技能 。
源码相对各种博客中的使用 , 显得有些无趣 , 但是有些东西 , 是源码中才有的知识 。
相信你对技术有着更深的追求 , 极客的学习就会追根究底且枯燥 。
本节中多次出现了一个类叫 AQS , 下一节让我们一起来揭开这个类的神秘面纱 。
【锁专题(五)ReentrantLock 深入源码详解】各位极客的点赞转发关注 , 是我创作的最大动力 , 感谢你的支持!
锁专题(五)ReentrantLock 深入源码详解文章插图