Condition接口概念
在使用显示锁,怎么使用等待和通知,就需要用Condition接口
任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,通过这些方法,我们可以实现线程间通信与协作(也称为等待唤醒机制),如生产者-消费者模式,而且这些方法必须配合着synchronized关键字使用,可以实现等待/通知模式。
Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。
与synchronized的等待唤醒机制相比Condition具有更多的灵活性以及精确性,这是因为notify()在唤醒线程时是随机(同一个锁),而Condition则可通过多个Condition实例对象建立更加精细的线程控制,也就带来了更多灵活性了,我们可以简单理解为以下两点
通过Condition能够精细的控制多线程的休眠与唤醒。
对于一个锁,我们可以为多个线程间建立不同的Condition。
(一)API
Condition是一个接口类,其主要方法如下:
public interface Condition { / 使当前线程进入等待状态直到被通知(signal)或中断, 当前线程将进行运行状态且从await()方法返回的情况,包括: 当其他线程调用singal()或singalAll()方法时,该线程将被唤醒 当其他线程调用interrupt()方法中断当前线程 如果当前等待线程从await()方法返回,那么表明该线程已经获取了Condition对象所对应的锁 await()相当于synchronized等待唤醒机制中的wait()方法 */ void await() throws InterruptedException; / 当前线程进入等待状态,直到被通知,从方法名称上可以看出该方法对中断不敏感 / void awaitUninterruptibly(); /当前线程进入等待状态直到被通知,中断或者超时,返回值表示剩余时间,如果在nanosTimeout纳秒之前被被唤醒, 那么返回值就是(nanosTimeout-实际耗时.)如果返回值是0或者负数,那么可以认定已经超时了 / long awaitNanos(long nanosTimeout) throws InterruptedException; /await()可以理解为synchronized的wait() / boolean await(long time, TimeUnit unit) throws InterruptedException; /当前线程进入等待状态直到被通知,中断或者到某个时间,如果没有到指定的时间就被通知, 方法返回true,否则,表示到了指定时间,方法返回false / boolean awaitUntil(Date deadline) throws InterruptedException; /唤醒一个等待在condition上的线程,该线程从等待方法返回前必须获取与condition相关联的锁 signal() 可以连接为synchronized的notify() / void signal(); /唤醒索引等待在condition上的线程,能够从等待方法返回的线程必须获取与condition相关联的锁 signalAll()可以理解为synchronized的otifyAll() */ void signalAll();} |
---|
关于Condition的实现类是AQS的内部类ConditionObject
(二)Condition使用范式