A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 007诸葛亮 于 2013-6-6 18:52 编辑

JDK1.5 后出现了LOCK,同一个LOCK可以拥有多个condition对象,如何识别某一condition对象能够唤醒哪些线程?

4 个回复

倒序浏览
进去的时候,加锁,出来的时候释放锁。不用再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();       }   }}
回复 使用道具 举报
condition.signal()可以唤醒所有使用相同Condition实例执行await()操作的线程。
回复 使用道具 举报
唤醒和等待是成对的。举例来说,你创建两个condition对象,condition1、condition2。
condition1.signle()对应唤醒的就是condition1.await(),并不涉及condition2.await()。同理,condition2.signle()对应唤醒的就是condition2.await()。
当然如果是condition1(或2).signleAll()唤醒的就是当前所有线程池中的线程,也就不区分condition1或者condition2了。

其实挺好理解的,不知道我说明白了嘛~{:soso_e112:}
回复 使用道具 举报 1 0
王鑫 发表于 2013-6-5 20:07
唤醒和等待是成对的。举例来说,你创建两个condition对象,condition1、condition2。
condition1.signle() ...

谢谢,通俗易懂!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马