AbstractQueedSynchronizer(队列同步器)是用于构建锁或其他同步组件的基本框架。它使用int类型的变量在fifo队列中构建时表示同步状态,以完成所获得的资源排队。同步需求实现的基础。
在了解AbstractQueeedsynchronizer之前,首先了解锁定接口。在了解锁定接口之前,首先了解锁定是什么?锁定用于控制多个线程访问共享资源。相互锁定可以防止多个线程同时访问共享资源。在出现锁定接口之前,我们都知道Java程序员通过同步关键字实现了锁定功能。在Java SE 5之后,锁定界面及其相关的实现被添加到收入功能,锁界面及其实现与同步的同步函数与以下差异相比。
1.1锁定接口提供的同步关键字的主要特征没有尝试获得锁定的主要功能。当前的线程试图获得锁定。锁定锁定的螺纹可以响应中断。当线程中断时,中断是异常的,则在指定的时间内获得释放锁定超时,并且无法获得锁定,而不是指定时间。一个点是,锁的释放必须在最终块中释放。目的是确保在获得锁后,最终将发布。不要在TRY代码块中写下锁定,因为如果获得锁定的锁定异常,则不应在发行锁的代码块上执行锁定锁这次。
1.3锁定接口主API(获取锁定/释放锁)void lock()获取锁;调用该方法的线程将获得锁定。当获得锁定时,返回void lockitrepription()抛出国际锁定锁和锁定方法之间的差异是,此方法可以响应中断,即在锁定的过程中,您可以中断当前的线程boolean boolean trylock();尝试获取非块的锁定,并在调用此方法后立即返回。如果您可以得到它,则可以得到它。返回真实,否则返回falseboolean trylock(长时间,TimeUnit单元)抛出InterruptedException;如下:1。当前线程在指定的超时2中获取锁定。释放锁定链接newCondition();获取等待通知组件,组件和当前锁定绑定,当前线程只能调用组件的wait()方法,并且当前线程可以称为呼叫,当前线程将释放锁avracize atrackequeedsynchronizer(queue synchronizer)是实现锁定的关键。在实施锁定实现时,同步器用于实现锁的语义。
2.1 AbstractQueeEedsynchronizer界面和样品同步器设计基于模板。用户需要继承同步器并重写指定的方法,然后在实现自定义同步组件的实现中组合同步器,然后调用由同步器提供的模板。该方法,模板方法将调用用户的重写方法(子类)。
重写同步器指定的方法时,您需要使用同步器提供的以下3种方法来访问或修改同步状态
同步器可以如下重写该方法:
总结:
受保护的布尔tryAcquire(INT ARG)独家密封状态,实施此方法需要当前状态,并确定同步状态是否符合期望,然后设置同步的布尔tryRelease(INT ARG)CAS设置的独家发布状态。同步状态将有机会获得同步int tryAcquireShared同步状态同步状态的同步状态(int arg)共享同步状态,返回大于或等于0的值,这意味着收购的成功在失败的prietsesessessessessesessesessesessessessesessesessessessessessessessessessessessessessessessessessessestate-crot-protected boolean isheldExclusively()当前同步器以独家模式以线程释放。通常,此方法指示当前线程提供的模板方法。
同步器提供的模板方法主要分为三类:
总结:
void获取(int arg)专门获得同步状态。如果当前线程获得同步状态成功,则该方法将返回;否则,它将输入同步等待队列并等待。void ackeire decariredrection(int arg)与获取方法相同,但是此方法可以响应中断。当前螺纹不会将同步状态获得到同步队列中。如果当前螺纹被中断,该方法会基于可获取的方法引发中断异常的tryacquirenanos),则添加了超时限制。如果当前线程在超时时间内未获得同步状态,请返回false,然后返回trueAcquireshared(int arg)共享金额以获得同步状态。如果未获得当前螺纹在同步状态中,它将进入同步队列并等待。独家采集之间的主要区别在于,同时,可以同时获得同步状态。arg,长纳米级,基于收购中断,它增加了超时布尔释放(INT ARG)独家发布同步状态。在发布同步状态后,同步队列中包含第一个节点的线程将唤醒布尔lleaSeshared(int arg)share -share -shared同步status collection collection collection collection collection gettequeumpthreads()获取线程集合等待同步队列2.2定制的独家锁定的独家锁定型摘要摘要摘要摘要摘要摘要摘要quartivequedsynchronizer的理解。独家锁定。其他获得锁的线只能在等待队列中等待。仅通过使锁线释放锁,后续线程才能得到锁。(如果您不知道太多,可以写一次,基本上可以理解它)
汇总自定义同步组件互斥互助锁:
我们可以通过自定义同步组件Mutex.Mutex来看到静态内部类,该类别继承同步器并实现了独家采集和释放同步状态。当使用Mutex时,用户不直接处理内部同步器。相反,它调用Mutex提供的方法。在实现Mutex时,获取锁定锁的锁定方法是用作示例。它只需要在同步器的方法实现中调用同步器,即可使用模板方法。该实现方法大大降低了阈值以实现可靠和自定义的同步组件。
分析的主要内容包括以下方面
3.1同步队列同步队列队列内部(FIFO)的同步队列以完成同步状态管理。线程参考,候补状态,前驱动预见和后继接下来的节点。
说明节点源代码的关键部分:
在AmpactQueedSynchronizer的内部类别中,同步队列中的节点和Ampactqueuedsynchronizer将保持第一个节点和尾部节点,以获取队列的尾巴。
通过一组图片查看AQ的结构
AQS同步队列的基本结构
AQS同步队列加入节点
AQS同步队列设置第一个节点
3.2独家同步状态采集和发布独家同步状态,通过调用呼叫同步器的获取(INT ARG)来获得同步状态。请注意,该方法对中断没有响应。
获取获取分析(INT ARG)源代码分析
获取(int arg)addWaiter(节点模式)
AddWaiter(节点模式)ENQ(节点)
获取(int arg)获取(最终节点节点,int arg)
为什么可以尝试尝试获得同步状态的当前节点的前驱动节点?
让我们看一个节点self -spin以获取同步状态的图片,然后总结原因
获取(int arg)顺序图
3.2成功获得同步状态后,当前线程从获取(INT ARG)方法返回以执行响应逻辑执行。同步状态需要发布。随后的节点可以继续获得同步状态。请释放同步状态调用该版本(INT ARG)方法。在此方法释放同步状态后,它将唤醒其他后继节点。
源代码分析:
3.3同步同步状态采集和发布摘要3.3共享同步状态采集并发布
共享同步状态采集和独家同步状态之间的主要区别在于,可以同时获得同步状态的发布。此时同时运行多个阅读操作,但是写作操作将被阻止。独家访问(例如写作操作)将在此时阻止所有其他读取操作。
共享和独家访问资源的比较
源代码分析:
获取(int arg)doacquireshaared(int arg)
共享同步状态发布
共享释放同步状态与独家公式不同。由于同步状态,共享状态可以通过多个线程获得。自然发布时,它也可能来自多个线程。因此,可以在信号码中读取实施,该信号量支持多线程同时访问组件。
3.4独家超时同步状态获得超时同步状态采集,这意味着,如果可以在指定的时间段内获得同步状态,则可以返回真实,否则,否则将返回false;稍后将仍会在同步化上被阻止;超时同步状态获得了doacquirenanos(int arg,long nanostimeout)方法,而无需在指定时间内获得同步状态,并将抛出IntruptedException并立即返回。
不同之处
void获取(int arg)专门获得同步状态。如果当前线程获得同步状态成功,则该方法将返回;否则,它将输入同步等待队列并等待。void ackeire decariredrection(int arg)与获取方法相同,但是此方法可以响应中断。当前螺纹不会将同步状态获得到同步队列中。如果当前螺纹被中断,该方法会基于可获取的方法引发中断异常的tryacquirenanos),则添加了超时限制。如果当前线程在超时时间内未获得同步状态,请返回false,然后返回到真实的源代码分析。
doacquirenanos(arg,nanostimeout)
企业家超时以获得同步状态流程图