链接地址:http://www.xx566.com/detail/153.html
上一篇Guava库学习:学习Concurrency(一)Synchronizing threads中, 我们简单的介绍了一下Guava Concurrency,并且指出了Java并发编程控制线程同步时可能存在的几个问题,Guava Concurrency为我们提供了解决方案:本篇我们学习的Monitor监控类,它允许多个条件,不再明确的通知线程,而是隐式的通知,完全消除了通 知所有线程的可能。
首先,我们通过阅读源码来了解Monitor类,源码上这样定义:A synchronization abstraction supporting waiting on arbitrary boolean conditions,翻译过来就是:一个支持任意布尔条件的同步的抽象。Monitor类是作为ReentrantLock的一个替代,代码中使用 Monitor比使用ReentrantLock更不易出错,可读性也更强,并且也没有显著的性能损失,使用Monitor甚至有潜在的性能得到优化。下面我们整体上对Monitor的源码结构做一下梳理,如下:
public abstract static class Guard:一个标识线程是否等待的布尔条件,Guard类总是与单一的Monitor相关联,Monitor可以在任意时间从任意占用Monitor的线程检查Guard,这样代码的编写将不在关心Guard是否被检查的频率。
public abstract boolean isSatisfied():Guard内部提供的抽象方法,isSatisfied(),当被关联的Monitor被占用时,Guard的此方法会被调用,该方法的实现必须取决于被关联Monitor保护的状态,并且状态不可修改。
enter():进入到当前Monitor,无限期阻塞。
enterInterruptibly():进入到当前Monitor,无限期阻塞,但可能会被打断。
enter(long time, TimeUnit unit):进入到当前Monitor,最多阻塞给定的时间,返回是否进入Monitor。
enterInterruptibly(long time, TimeUnit unit):进入到当前Monitor,最多阻塞给定的时间,但可能会被打断,返回是否进入Monitor。
tryEnter():如果可以的话立即进入Monitor,不阻塞,返回是否进入Monitor。
enterWhen(Guard guard):当Guard的isSatisfied()为true时,进入当前Monitor,无限期阻塞,但可能会被打断。
enterWhenUninterruptibly(Guard guard):当Guard的isSatisfied()为true时,进入当前Monitor,无限期阻塞。
enterWhen(Guard guard, long time, TimeUnit unit):当Guard的isSatisfied()为true时,进入当前Monitor,最多阻塞给定的时间,这个时间包括获取锁的时间和等待Guard satisfied的时间,但可能会被打断。
enterWhenUninterruptibly(Guard guard, long time, TimeUnit unit):当Guard的isSatisfied()为true时,进入当前Monitor,最多阻塞给定的时间,这个时间包括获取锁的时间和等待Guard satisfied的时间。
enterIf(Guard guard):如果Guard的isSatisfied()为true,进入当前Monitor,无限期的获得锁,不需要等待Guard satisfied。
enterIfInterruptibly(Guard guard):如果Guard的isSatisfied()为true,进入当前Monitor,无限期的获得锁,不需要等待Guard satisfied,但可能会被打断。
enterIf(Guard guard, long time, TimeUnit unit):如果Guard的isSatisfied()为true,进入当前Monitor,在给定的时间内持有锁,不需要等待Guard satisfied。
enterIfInterruptibly(Guard guard, long time, TimeUnit unit):如果Guard的isSatisfied()为true,进入当前Monitor,在给定的时间内持有锁,不需要等待Guard satisfied,但可能会被打断。
tryEnterIf(Guard guard):如果Guard的isSatisfied()为true并且可以的话立即进入Monitor,不等待获取锁,也不等待Guard satisfied。
waitFor(Guard guard):等待Guard satisfied,无限期等待,但可能会被打断,当一个线程当前占有Monitor时,该方法才可能被调用。
waitForUninterruptibly(Guard guard):等待Guard satisfied,无限期等待,当一个线程当前占有Monitor时,该方法才可能被调用。
waitFor(Guard guard, long time, TimeUnit unit):等待Guard satisfied,在给定的时间内等待,但可能会被打断,当一个线程当前占有Monitor时,该方法才可能被调用。
waitForUninterruptibly(Guard guard, long time, TimeUnit unit):等待Guard satisfied,在给定的时间内等待,当一个线程当前占有Monitor时,该方法才可能被调用。
leave():离开当前Monitor,当一个线程当前占有Monitor时,该方法才可能被调用。
isFair():判断当前Monitor是否使用一个公平的排序策略。
isOccupied():返回当前Monitor是否被任何线程占有,此方法适用于检测系统状态,不适用于同步控制。
isOccupiedByCurrentThread():返回当前线程是否占有当前Monitor。
getOccupiedDepth():返回当前线程进入Monitor的次数,如果房前线程不占有Monitor,返回0。
getQueueLength():返回一个估计的等待进入Monitor的线程数量,只是一个估算值,因为线程的数量在这个方法访问那不数据结构的时候可能会动态改变。此方法适用于检测系统状态,不适用于同步控制。
getWaitQueueLength(Guard guard):返回一个等待给定Guard satisfied的线程估计数量, 注意,因为超时和中断可能发生在任何时候,所以估计只作为一个等待线程的实际数目的上限。此方法适用于检测系统状态,不适用于同步控制。
hasQueuedThreads():返回是否有任何线程正在等待进入这个Monitor,注意,因为取消随时可能发生,所以返回true并不保证任何其他线程会进入这个Monitor。此方法设计用来检测系统状态。
hasQueuedThread(Thread thread):返回给定线程是否正在等待进入这个Monitor,注意,因为取消随时可能发生,所以返回true并不保证给定线程会进入这个Monitor。此方法设计用来检测系统状态。
hasWaiters(Guard guard):返回是否有任何线程正在等待给定Guard satisfied,注意,因为取消随时可能发生,所以返回true并不保证未来Guard变成satisfied时唤醒任意线程。此方法设计用来检测系统状态。