作者adrianshum (Alien)
看板java
标题Re: [问题] synchronized(lock){lock.wait()}
时间Wed Oct 10 17:46:49 2007
※ 引述《adrianshum (Alien)》之铭言:
: ※ 引述《dreamboxer (陌生人)》之铭言:
: : 我不确定我所理解的有没有错误...但如果上面的程式以Java执行
: : 在 Thread A 里面写 lock.wait(); 是不是有点奇怪?@@
: : (应该分别写成wait()和notify()就好吧?)
: : 因为 lock.wait() 应该是指让 lock 这个物件/Class进到 Wait Pool 里去,
: : 而不是让 A 进到 Wait Pool 里去吧?@@
: : 执行上会变成,当A跑到synchronized(lock)的时候,会先去看lock这个物件是否被任何
: : Thread锁定,若没有被锁定,那麽就把lock这个物件丢到Wait Pool去,但A本身还是会
: : 继续执行下去...
: : B跑到synchronized(lock)的时候,会先去看lock这个物件是否被任何Thread锁定,若
: : 没有被锁定,那麽就把lock这个物件从Wait Pool叫醒。但若lock这个物件已经被丢到
: : Wait Pool,那lock应该是在被锁定的状态,所以B跑到synchronized(lock)的时候,
: : 因为没有Thread把lock这个物件的锁解开,所以永远不会去跑lock.notify(),而会一直
: : 在那等。
: : 有错请鞭...orz
: 应该是你搞错了.
: 所谓 wait pool, wait 的就是 Thread 本身.
: 详细的实作我不太清楚, 但 lock.wait(), 概念
: 上而言, 就是 current thread 放到 lock 的 wait pool
: 里等待, 直到有人 invoke lock 的 notify() 来
: 唤醒 pool 中的 thread.
: 其实, 你自己写一个 testing app 试试不就知道了吗?
: Alien
顺手写了一个测试程式 (我上班在作啥? XD)
class WaitThread extends Thread {
Object lock = null;
public WaitThread(Object lock) {
this.lock = lock;
}
public void run() {
try {
System.out.println("WaitThread Run");
synchronized(lock) {
System.out.println("WaitThread Lock Acquired, wait now");
lock.wait();
System.out.println("WaitThread Woke up, do something...");
Thread.sleep(5000);
System.out.println("WaitThread Finished");
}
System.out.println("WaitThread out of sync block");
} catch (Exception e) {
}
}
}
class NotifyThread extends Thread {
Object lock = null;
public NotifyThread(Object lock) {
this.lock = lock;
}
public void run() {
try {
System.out.println("NotifyThread Run");
synchronized(lock) {
System.out.println("NotifyThread Lock Acquired, notify now");
lock.notify();
System.out.println("NotifyThread Invoked Notify, do
something...");
Thread.sleep(5000);
System.out.println("NotifyThread Finished");
}
System.out.println("NotifyThread out of sync block");
} catch (Exception e) {
}
}
}
public class ArgTest {
public static void main(String[] args) throws Exception{
Object lock = new Object();
WaitThread waitThread = new WaitThread(lock);
NotifyThread notifyThread = new NotifyThread(lock);
waitThread.start();
Thread.sleep(2000);
notifyThread.start();
waitThread.join();
notifyThread.join();
}
}
结果:
WaitThread Run
WaitThread Lock Acquired, wait now
NotifyThread Run
NotifyThread Lock Acquired, notify now
NotifyThread Invoked Notify, do something...
NotifyThread Finished
NotifyThread out of sync block
WaitThread Woke up, do something...
WaitThread Finished
WaitThread out of sync block
对照着看大概没有太多疑问了吧? :)
Alien
UPDATED: 把原本一堆 try catch 修一修, 容易看一点
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.22.246.26
※ 编辑: adrianshum 来自: 202.22.246.26 (10/10 17:52)
※ 编辑: adrianshum 来自: 202.22.246.26 (10/10 17:53)
1F:推 dreamboxer:谢谢你! 11/17 19:54