栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么是Java中的条件变量?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么是Java中的条件变量?

Q1)
最好的资源可能是Condition类的JavaDoc。条件变量是一种机制,允许您在允许方法继续执行之前测试特定条件是否成立。在您的示例中,有两个条件,

notFull
notEmpty

您的示例中显示的put方法在

notFull
条件尝试添加到数组中之前等待条件变为真,一旦插入完成,它将发出信号
notEmpty
通知条件唤醒所有阻塞的线程,等待线程从数组中删除元素。

…条件变量是否一定必须在’mutex.acquire()和’mutex.release()’块内?

任何更改条件变量的调用都必须在同步区域内-
这可以通过内置

synchronized
关键字或
java.util.concurrent
包提供的同步器类之一(例如Lock)进行。如果您不同步条件变量,则可能有两个负面结果:

  1. 丢失信号-这是一个线程检查条件并发现它不成立的地方,但是在阻止另一个线程进入之前,它执行了一些操作以使条件变为真,然后向所有等待该条件的线程发出信号。不幸的是,第一个线程已经检查了条件,并且即使实际上可以继续执行,也仍然会阻塞。

  2. 第二个问题是通常的问题,您可能有多个线程试图同时修改共享状态。在您的示例中,可能

    put()
    同时调用了多个线程,然后所有线程都检查条件,并发现数组未满并尝试插入其中,从而覆盖了数组中的元素。

Q2) 定时等待对于调试目的很有用,因为它们允许您在未通过信号唤醒线程的情况下记录信息。

使用

sleep()
代替定时的等待是不是一个好主意,因为上面提到你需要调用
await()

一个同步的区域内的方法,并
sleep()
不会释放任何持有的锁,而
await()
做。这意味着任何睡眠线程仍将保持其已获取的锁,从而导致其他线程不必要地阻塞。

Q4)
从技术上讲,

signal()
如果您使用的是定时等待,则不需要呼叫,但是,这样做意味着直到超时过去,所有等待都不会返回,这至少可以说是无效的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438577.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号