为了账号安全,请及时绑定邮箱和手机立即绑定

请问下这个做用是什么?Condition用来干嘛的?

请问下这个做用是什么?Condition用来干嘛的?

温温酱 2023-03-03 13:09:27
private Lock lock = new ReentrantLock();private Condition threadCond = lock.newCondition();
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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、有限缓存操作

@ThreadSafe

public 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();

}

}
}

 


查看完整回答
反对 回复 2023-03-06
  • 1 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号