睡眠()维护锁,但wait()不维护锁,
我对等待的想法是,它释放锁,让其他线程有机会在等待时获得该线程上的监视器。
但是,对于(),线程为什么在睡眠时维护锁,因为它总是在休眠后进入可运行状态。
发布于 2014-08-29 17:33:15
Thread.sleep与锁定没有任何关系。
在持有锁时需要调用Object.wait,因为在保持锁时需要对停止等待的条件进行测试,以便对条件具有一致的视图。但通常情况下,一根线在睡觉时没有锁住。
抱着锁睡觉似乎是很糟糕的行为。但是,如果你需要多个锁,在那里你获得一个,并且在重新尝试得到另一个之前必须退却,那么在持有一个锁的时候睡觉也许是有意义的。如果调用睡眠释放锁,这种退避策略将无法奏效。
让Thread.sleep对锁置若罔闻使API变得更简单,并给程序员更多的选择(不完全排除需要保持锁的线程使用它)。
发布于 2014-08-29 17:54:38
为什么线程在休眠时维护锁,因为它总是在休眠后进入可运行状态。
考虑以下情况:-
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 睡眠执行线程所依赖的处理器的可用性),如果另一个线程偶然地使用了锁,则程序可能根本不会恢复,这会使程序行为不一致。这可能是它不释放任何锁的原因之一。
发布于 2014-08-29 18:00:09
Q:,Thread.sleep(n)做什么?
A:没什么。绝对什么都没有。
Q:需要多长时间?
A:如果线程没有中断,至少有n毫秒。
您不需要了解关于Thread.sleep()的其他内容。
https://stackoverflow.com/questions/25573327
复制相似问题