java - 条件变量的await()释放锁吗?
问题描述
譬如下面的两个条件变量 isEmpty和isFull当调用他们的await()时,lock.lock()上的锁会被释放吗?
这里有3个对象,一个i哦是lock,一个是isEmpty,一个是isFull上锁的对象是lock,而不是isEmpty或者isFull那isFull或者isEmpty释放的锁确实lock上的?
private volatile boolean usedData = true;//mutex for dataprivate final Lock lock = new ReentrantLock();private final Condition isEmpty = lock.newCondition();private final Condition isFull = lock.newCondition();public void setData(int data) throws InterruptedException { lock.lock(); try {while(!usedData) {//wait for data to be used isEmpty.await();}this.data = data;isFull.signal();//broadcast that the data is now full.usedData = false;//tell others I created new data. }finally {lock.unlock();//interrupt or not, release lock } }
问题解答
回答1:await的doc有这么一句啊The lock associated with this Condition is atomically released
回答2:谢邀,答案:
会;是;
await()的作用是能够让其他线程访问竞争资源,所以挂起状态就是要释放竞争资源的锁。 在javaSE5的java.util.concurrent类库中,使用互斥并允许任务挂起的基本类就是Condition,你可以通过await()来挂起一个任务,当外部条件改变时,意味着某个任务可以继续执行,你可以通过signal()来通知这个任务。
每个lock()的调用必须紧跟一个try-finally子句,用来保证在所有情况下都可以释放锁。任务在可以调用await(),signal(),signalAll()之前,必须拥有这个锁。
相关文章:
1. html5 - vue-cli 装好了 新建项目的好了,找不到项目是怎么回事?2. javascript - jQuery post()方法,里面的请求串可以转换为GBK编码么?可以的话怎样转换?3. javascript - 一排三个框,各个框的间距是15px,距离外面的白框间距也是15px,这个css怎么写?4. django - python 2层文件夹导入5. javascript - vue 手机端项目在进入主页后 在进入子页面,直接按返回出现空白情况6. javascript - nodejs调用qiniu的第三方资源抓取,返回401 bad token,为什么7. mysql - C#连接数据库时一直这一句出问题int i = cmd.ExecuteNonQuery();8. css - ul ol前边的标记如何调整样式呢9. python - 用urllib抓取网页上的下载链接,目标文件是xls形式,但发现抓下来的xls是空表,里面只有一句报错信息,求帮助。10. python3.x - python 中的maketrans在utf-8文件中该怎么使用

网公网安备