黑马程序员技术交流社区
标题:
JDK1.5后,出现了LOCK,如何识别哪些condition对象唤醒相应线程
[打印本页]
作者:
007诸葛亮
时间:
2013-6-5 19:39
标题:
JDK1.5后,出现了LOCK,如何识别哪些condition对象唤醒相应线程
本帖最后由 007诸葛亮 于 2013-6-6 18:52 编辑
JDK1.5 后出现了LOCK,同一个LOCK可以拥有多个condition对象,如何识别某一condition对象能够唤醒哪些线程?
作者:
eycrckag
时间:
2013-6-5 19:54
进去的时候,加锁,出来的时候释放锁。不用再notifyAll().可以叫醒对方。允许一个锁搞出多个condiiton对象。
1、在某些情况下,当内部锁非常不灵活时,显式锁就可以派上用场。内部条件队列有一些缺陷,每个内部锁只能有一个与之相关联的条件队列。2、使用显式的Lock和Condition的实现类提供了一个比内部锁和条件队列更加灵活的选择。一个Condition和一个单独的Lock相关联,就像条件队列和单独的内部锁相关联一样。每个锁可以有多个等待集、中断性选择、基于时限、公平性选择等。public interface Condition{ void await() throws InterruptedException;//相当于wait boolean await(long time,TimeUnit unit) throws InterruptedException; long awaitNanos(long nanosTimeout) throws InterruptedException; void awaitUninterruptibly(); boolean awaitUntil(Date deadline) throws InterruptedException;void signal();//相当于notify void signalAll();//相当于notifyall}调用与Condition相关联的Lock的Lock.newCondition方法,可创建一个Condition.3、有限缓存操作@ThreadSafepublic class ConditionBoundedBuffer<T>{ protected final Lock lock=new ReentrantLock(); private final Condition notFull=lock.newCondition(); private final Condition notEmpty=lock.newCondition(); @GuardBy("lock"); private final T[] items=(T[]) new Object[BUFFER_SIZE]; @GuardBy("lock") private int tail,head,count;public void put(T x) throws InterruptedExceptoin{ lock.lock(); try{ while (count=items.lentgh) notFull.await(); items[tail]=x; if (++tail=items.length) tail=0; ++count; notEmpty.signal(); } finally{lock.unlock(); } }public T take() throws InterruptedException{ lock.lock(); try{ while (count=items.lentgh) notEmpty.await(); T x=items[head]; items[head]=null; if (++head=items.length) head=0; --count; notFull.signal(); return x; } finally{lock.unlock(); } }}
作者:
黄丽军
时间:
2013-6-5 20:02
condition.signal()可以唤醒所有
使用相同Condition实例
执行await()操作的线程。
作者:
王鑫
时间:
2013-6-5 20:07
唤醒和等待是成对的。举例来说,你创建两个condition对象,condition1、condition2。
condition1.signle()对应唤醒的就是condition1.await(),并不涉及condition2.await()。同理,condition2.signle()对应唤醒的就是condition2.await()。
当然如果是condition1(或2).signleAll()唤醒的就是当前所有线程池中的线程,也就不区分condition1或者condition2了。
其实挺好理解的,不知道我说明白了嘛~{:soso_e112:}
作者:
007诸葛亮
时间:
2013-6-5 20:15
王鑫 发表于 2013-6-5 20:07
唤醒和等待是成对的。举例来说,你创建两个condition对象,condition1、condition2。
condition1.signle() ...
谢谢,通俗易懂!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2