当前位置: 首页 > 网络应用技术

实现Java Multi -Threading Reunion Reentrantlock的AQS

时间:2023-03-08 19:00:35 网络应用技术

  在Java系统中,锁是在多线程中实现同步的重要机制。Java的锁已同步。这是由JVM级别实现的锁。工人执行锁定的一篇文章,该锁定也来自本文中提到的AQS实现。

  可以看出以下代码,AQS类的继承关系相对简单,即继承AbstractOnderablesynchronizer类并实现可序列化的界面。

  AbstractOwnablesynchnchronizer具有简单的功能。它主要是设置其他线程的锁。设置它是由它排出的。它没有设置为共享锁。

  以下是aqs中更重要的变量。头正在等待队列中的前节点。尾巴正在等待队列中的尾部节点。状态是同步状态值。

  将其添加到节点类的数据结构的定义中:队列中的waitstatus枚举:1。cancelly(1)此节点是由于超时或中断引起的。2。节点(-1)节点的后继器被阻止,因此,当当前节点取消或释放锁定时,它需要unvark才能唤醒后节点。3.Condition(-2)此节点是条件的队列.4。propagate(-3)是当前节点操作到其他节点的传播,例如多电子共享模式的发布锁定是传播后续节点。5.0。5.0不是上述任何一个状态

  首先查看Reentrantlock的采集锁的过程。它的构造函数初始化了一个非fairsync,这意味着这个重锁是非封锁的。

  从这里查看Reentrantloc默认创建的非flat锁,呼叫锁将直接进行CAS尝试锁定(此处state = 0没什么表示无表示,1表示线程已抓住锁定).AQS的获取方法默认参数1要获得锁,

  然后查看AQS访问方法的逻辑,以获取AQS方法的逻辑1 TryAcquire尝试获取锁定。2.如果失败,请在等待队列中添加他的节点

  非fair锁,您将尝试在开始时锁定,无论等待队列中是否有等待线程,

  尝试锁定上述故障后,上面的TryAcquire然后执行AddWaiter(Node.Exclusive)创建一个新的节点行并加入等待队列。

  下图是将上面的节点添加到队列末端的过程。这里指出,两个路线队列首先指向原始尾巴。

  以下ENQ是FOR的无限环中新建的节点,因此将新节点添加到等待队列中。

  将新的尾部节点添加到等待队列后,然后执行会计方法,参数是等待队列中的节点和args(TryAcquire的获取变量)。该方法的逻辑是处理新节点以加入等待队列,然后在队列中trywake在队列中运行线程,

  应该在获得锁后,应该观察锁。

  如果未能获得锁,则在获取的方法中失败的方法是正确的,请致电casteracquire取消获得锁,

  唤醒前轮驱动节点的逻辑来自尾部的尾部节点,并且通过在链接列表上找到少于0的节点(即未取消的线程),然后执行umpartlocksupport唤醒线程,等待锁定。这是上面的两条通道。链接列表是两个指针。在两个步骤中,首先添加了流行指针,因此您必须从后部传递到前面,以确保所有节点穿越。

  在我们看到如何释放锁后,他就像AQS父亲-in -law的释放方法。

  减去发行版的状态变量后,如果C = 0,则意味着没有锁没有锁,则将线程设置为null,并且状态变量设置为0

  本文主要分析添加其锁定和释放其锁定和锁定锁定的过程。它主要分析它,主要围绕状态变量和CLH的两个末端队列扩展以及线程阻挡。