我们都知道Java并发编程是重点,除了理论知识外,实际使用通常由JUC(Java并发工具包)完成。在除了最有用的线程池外,JUC是JUC锁,是JUC锁,JUC锁中使用的最常用的是重新进入,因此,Reentrantlock几乎是工作面试的障碍。
理解重新进入的锁对理解其他类型的JUC非常有帮助。思想和实施是相似的,难度也不低。您可以学习很多细节。
因此,有必要完全理解重新进入。
实际上,实现锁的基本过程相似。如果没有竞争,它将不会被锁定。竞争时,让竞争对手等待(旋转或线程悬挂),并在锁定释放时争夺锁定资源。同时,重新进入,重新进入和分布式锁是所有的想法。不同之处在于,这些步骤的详细信息是不同的,从而导致使用不同的性能和场景。
当对象不竞争时,通过直接修改对象锁计数来解锁同步。Reentrantlock是通过修改状态变量通过SETNX的键。
当竞争时:同步升级到自动锁定锁,以不断确定乘员是否已释放锁,并将旋转旋转到目标锁定池中,以在某个数字上释放锁定资源;重新输入锁会在AQS队列中将线程包装到AQS队列中。它也是自速竞争资源的自速,在阻止其时需要悬挂的资源;REDIS分布式锁定也是自动旋转以获得锁。
因此,许多事情的思想是相同的。区别在于实现的细节。通常,它通常是为了实现其他锁无法达到的影响或适应特定场景的效果。细节非常有趣,您还可以学习一些设计思想。
该分析主要分为三个方面:重新进入的整体结构,锁定过程的具体实现以及一些关键的实施方法分析。
从代码中,您可以看到Reentrantlock实现锁定接口,几乎所有操作都是通过从AQ的内部抽象同步继承来实现的。
同步类的两个实现类:nonfairsync(fair锁定),fairsync(non -fair锁,默认值),两种方法:lock(lock()和tryAcquire(int access)insently.except这两个实现方法,所有AQS都提供了方法,因此特定的实现逻辑将随后移交给AQS。
锁()差异:由于非贴锁无需判断线程等待,因此他的锁()直接尝试拿起锁,而失败是正常获得锁。公平的锁不是试图直接接管锁。
tryAcquire(int访问)差异:公平锁将确定是否有线程在尝试获得锁时是否有线程等待(下面的公平锁实现的钥匙,下面的分析).fairness.in。非FAIR锁定逻辑完全相同。
获取锁的过程调用父类AQ的模板方法,典型的模板模式,并定义锁的主流过程。只要子类重写子过程。
尝试先获取锁。如果故障表示被占据,则将其封装到节点节点并添加AQS队列。
加入队列后,您是团队的负责人,然后尝试获得它。在团队开头或尝试获得失败之后,您将挂断电话,然后通过旋转获得锁并提供中断标记。
连续循环上述过程,直到获得锁。
类似于排队购买门票,尝试直接购买门票,发现某人正在排队。门票,否则,您将使用手机(挂)玩,直到购买前购买前购买之前。
获得锁定锁的公平锁和非挂锁的逻辑几乎是相同的。唯一的区别是,该方法更具判断力。
该方法的作用是确定是否有一个线程在当前线程的前面等待。没有当前线程,锁可以成功,以实现公平。
true表示没有空线,而团队的第一个不是当前线程。
False没有它,不是因为队列是空的,也可能是因为团队是当前线程。
原始:https://juejin.cn/post/7095271699939280392