2009-11-15 25 views
0

我正在阅读一本java 6书。示例代码段来自主题章节,在这里我需要澄清等待之后不应该处于阻塞状态而不是可运行状态?

synchronized(a){ //The thread gets the lock on 'a' 
a.wait(2000);// Thread releases the lock and waits for notify only for maximum of two seconds, then goes back to runnable state 
//The thread reacquires the lock 
//More instructions here 
} 

现在我的疑问是,2秒的等待时间之后,继续进一步执行代码下面给出,上面的代码将要求对象的锁'a',并且另一个线程(应该调用a)上的notify()可能已经在锁定它了。

因此,不应该在等待2秒钟之后线程进入阻塞状态,而不是像上面在注释中所述的运行状态(在第2行中)。

回答

1

如果另一个线程锁定了对象,那么是的,你是对的,它会等待。等待的javadocs在经过指定的时间量时指示以下行为。

“线程T然后从等待设置为该对象中移除,并为线程调度重新启用,然后以通常的方式与其他线程竞争权限以在对象上进行同步;一旦获得控制权对象的所有同步声明都恢复到现状 - 也就是等待方法被调用时的情况“

+0

在上述语句中,它表示”启用线程调度“,这意味着它现在处于Runnable状态。对? 但是,下一行指出现在它完成与其他线程权限同步(即获得锁) - 那么这将意味着线程在 - 锁定状态的对象锁 那么哪一个是正确的?它处于可运行状态还是处于阻塞状态? 如果我在任何地方都错了,请纠正我。 – Harish 2009-11-15 20:03:17

+0

如果没有其他线程拥有锁定,它将可以运行,但如果有其他锁定,则必须像其他人一样等待。你应该写一些测试来进一步探索这种行为。 – 2009-11-15 20:51:59

+0

感谢这个信息。我会按照建议尝试一些例子 – Harish 2009-11-15 21:58:12

相关问题