全名AmpactrackQueueedsynchronizer包裹在Java.util.concurrent.locks下,是一个框架。
一个简单的理解是,在多线程环境中,AQS封装了用于线程安全的安全操作包。查看重新输入锁:获取锁?成功是锁,否则将锁定在FIFO队列中,等待锁(线程悬挂或阻止),锁定释放的释放等等。
许多同步可以通过AQ轻松构建。
java.util.concurrentes在软件包中具有许多基本实现,例如Reentrantlock,CountDownLatch,Semaphore,ReentrantReadWritelock,Synchronousqueue和FutureTask基于AQS。
可以看出,在阅读Java数据包下的其他组件时,可以理解AQ!
包括核心内容的三个部分,以及获得/释放和其他实现的方法
1)状态状态:
如上所述,其含义也将与特定实施类具有不同的含义。让我们看一下几个常用同步的国家的含义:
2)FIFO队列高级第一个队列:
3)获取/发布方法:
通过遗传非较低的独家锁,状态= 0表示您可以锁定。状态= 1表示次要锁已持有。您可以通过重写TryAcquire和TryRelease方法来查看特定资源的处理。
在:
忽略中断的独家模式的输入方法
主要操作:
简而言之,它是将当前线程封装到节点节点中并添加到队列的尾部
1.1.1 ENQ方法自循环方法将节点添加到队列的尾部,直到成功
这种自动反向方法可确保可以将节点节点添加到等待
尝试获取独家中断模式的资源。如果该节点节点的前驱动节点是头部的,则有资格尝试获得资源。获得失败后
主要操作:
1.2.1。
主要操作
1.2.2,parkandcheckinter悬挂当前线程并检查中断徽标
借助locksupport#park,当前线被悬挂,同时,通过thread.intrupted()检查当前线的中断徽标。应该注意的是,此方法将清除中断徽标。所以
1.2.3,取消取消取消节点,需要获取资源
主要操作:
在独家模式发布中的资源
主要操作:
唤醒 - 遵循节点
在此模式下,您需要找出TryAcquireshared方法返回的三种值
应该注意的是,获得资源后将执行的sethead操作,也就是说,头将更改,但并不是说与先前头部相对应的节点已经发布了资源。头节点可能仍然是在运行中,他们携带的资源尚未发布
以一个实用的例子来查看:
从这个示例可以看出,它在节点后没有盲目觉醒,而是根据头部的变化成功获得了先前的觉醒节点。不觉醒后,节点不相同(存在这里的另一个问题是,如果可用资源为4,则队列中的节点A为5,4,但是由于顺序关系节点A被唤醒,请尝试获得资源故障,但会失败。尽管节点所需的资源满足要求,它不会唤醒节点B并传播...)
在共享模式下获取资源
访问资源
似乎独家模型的获得资源非常相似。一点点是setheadandpropagate
1.1.1 setheadandpropagate固定头,然后尝试在节点后醒来
1.1.2多电子共享模式,唤醒节点以确保点差;虽然排他性模式仅在发布资源发行时才获得头节点的后继节点
您需要注意两点:
从源代码角度的角度来看,分析了与获取和与资源相关资源的发布有关的源代码。其中,其支持响应中断的独家模式和响应中断的共享模式基本上是相同的。此处未描述中断响应。如果您有兴趣,可以看到源代码。
整个AQ的结构基于三个核心点
AQ在特定的工作中: