首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程等待和休眠方法的混淆

线程等待和休眠方法的混淆
EN

Stack Overflow用户
提问于 2014-08-29 17:30:15
回答 3查看 228关注 0票数 2

睡眠()维护锁,但wait()不维护锁,

我对等待的想法是,它释放锁,让其他线程有机会在等待时获得该线程上的监视器。

但是,对于(),线程为什么在睡眠时维护锁,因为它总是在休眠后进入可运行状态。

EN

回答 3

Stack Overflow用户

发布于 2014-08-29 17:33:15

Thread.sleep与锁定没有任何关系。

在持有锁时需要调用Object.wait,因为在保持锁时需要对停止等待的条件进行测试,以便对条件具有一致的视图。但通常情况下,一根线在睡觉时没有锁住。

抱着锁睡觉似乎是很糟糕的行为。但是,如果你需要多个锁,在那里你获得一个,并且在重新尝试得到另一个之前必须退却,那么在持有一个锁的时候睡觉也许是有意义的。如果调用睡眠释放锁,这种退避策略将无法奏效。

让Thread.sleep对锁置若罔闻使API变得更简单,并给程序员更多的选择(不完全排除需要保持锁的线程使用它)。

票数 2
EN

Stack Overflow用户

发布于 2014-08-29 17:54:38

为什么线程在休眠时维护锁,因为它总是在休眠后进入可运行状态。

考虑以下情况:-

代码语言:javascript
复制
private Object objLock = new Object();

public void myMethod() {
   .... 
   synchronized(objLock) {

      Thread.sleep(1000);   // make the current running thread sleep for 1 second only. 
      ... // Code here which needs to be executed immediately after 1 second sleep time
   }
   ....
}

如果在上述代码中调用睡眠时JVM重新释放锁,那么当它回到可运行状态时(执行的恢复将取决于调度和根据JLS 睡眠执行线程所依赖的处理器的可用性),如果另一个线程偶然地使用了锁,则程序可能根本不会恢复,这会使程序行为不一致。这可能是它不释放任何锁的原因之一。

票数 2
EN

Stack Overflow用户

发布于 2014-08-29 18:00:09

Q:,Thread.sleep(n)做什么?

A:没什么。绝对什么都没有。

Q:需要多长时间?

A:如果线程没有中断,至少有n毫秒。

您不需要了解关于Thread.sleep()的其他内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25573327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档