特征:
常见的API
conturrent.locks.Reentrantlock#NewCondition Creation创建条件等待队列java.util.concurrent.locks.reentrantlock#unlock unlock Unlock unlock示例:
如果我使用以下代码获取锁:
重新进入默认为非fair锁定呼叫堆栈:java.util.concurrent.locks.reentrantlock#锁
他将在非锁锁的锁定逻辑中直接调用两个逻辑:
呼叫完成后,获得锁的成功方法已完成,并执行了最终代表性方法。
如果锁失败,则执行代码后执行IF逻辑。实际上,这可以分为两种方法。
按照执行顺序,让我们先看一下团队的逻辑。
它是将当前节点插入队列,并在必要时初始化
之前,我们完成了阅读。当获得当前锁定时,锁发生故障时,它已成功输入AQS队列。接下来,我们继续看什么?
可以在呼叫期间调用多种方法。将执行一些操作。
将堆栈调用如下:java.util.concurrent.locks.reentrantlock#解锁
我们可以从方法开始
发行锁主要调用。首先,将上一个问题直接考虑到状态-1,然后如果当前线程不再持有锁,我们可以修改iTessence
锁定成功后,该方法将再次返回,并将再次判断。如果AQS队列不是空的,则排队线程醒来。
实际上,这里最重要的是它将返回这里。唤醒后强锁的逻辑仍在内部。
当前的节点被唤醒。它将首先将方法留在方法中,然后如果锁定成功,请尝试返回到True。
再次竞争锁主要是调用方法中的方法以获取锁定。如果锁定失败,请再次锁定锁,如果锁定成功返回。
如果当前线程被中断,则在当前线程中断后将中断线程中断,因此可以中断支撑。相关源代码:
实验代码:
输出结果:
您可以支持设置锁的超时,该锁定可以有效地避免线程饥饿的测试代码:
输出结果
条件出现在Java 1.5中。它用于替换传统对象wait(),notify()以实现线程之间的协作。与对象的wait()相比,notify(),使用条件的等待(),signal()在线程之间的线路协作方面更加安全,更有效。因此,通常建议使用条件。阻止队列实际使用条件来模拟线程之间的协作。条件是一个接口,基本方法是()和signal()方法;条件取决于锁定界面以生成条件的基本代码。在锁定保护中,这意味着必须在lock.lock()和lock.unlock ::
测试场景:以下场景需要ABC3线程,将A螺纹A打印一次,然后在线程B中进行两次打印,然后打印3次C。该线程交替打印。ABC线程需要交替执行。我们需要控制它。线程执行的顺序可以通过多条件条件控制。每个线程都有一个条件对象。调用各种等待的方法以使线程等待,然后让其他线程调用其他线程调用。
输出结果如下:
原始:https://juejin.cn/post/7101956094137729031