问题
I learned that calling an Object's wait()
method will release the object monitor, if present.
But I have some questions regarding calling notify()
on this object by another thread:
(when) will the waiting thread wake up, if another (a 3rd) thread owns the object monitor in the meanwhile?
will the waiting thread wake up, if a 3rd thread called
wait()
on this object?is it possible to determine if a thread is waiting for notifying a particular object (java 1.4/java 5)
What's happening if
wait()
will be called in thefinalize()
method?
回答1:
notify
will wake one thread waiting on the monitor. Unless and until the monitor is unowned, no thread waiting can run; wait() must be called in a synchronized block and so the lock must be held to continue running that block.- No guarantees. Call
notifyAll
to give all threads a chance to wake. - Dunno. You could have the thread set a variable saying it's waiting before it goes to sleep...
- This is probably a bad idea. Can you come up with a situation where this is necessary?
回答2:
When you call wait() from a thread, that thread stop executing and it's added to the waitset of the object. When you call notify() from another thread, a random thread from the waitset is waked up, if you call notifyAll() all would be ready to execute.
When you call notify(), the thread is ready to run but it doesnt mean it will be executed inmediately so be careful.
It would wake up a thread from the waitset randomly.
Youd don't know which one will be waked up first, it doesn't follow any order.
Thread.getState()
You would produce deadlock.
回答3:
That's why you have the
notify()
andnotifyAll()
methods. The former wakes up one thread waiting on the object, the latter wakes up all threads. A waiting thread will not wake up ifwait()
is called in another thread.No.
It's only possible to call
thread.holdsLock(obj)
to see if a thread holds the monitor lock on a particular object.Don't call
wait()
in a finalize method.
回答4:
2: Not necessarily. notify()
wakes up one of the waiting threads. It might be the original one or the third one.
3: Using thread.getState()
you can find out if a thread is waiting for an object, but I don't know if you can always find out which object this is, exactly.
来源:https://stackoverflow.com/questions/3190545/java-wait-notify-and-synchronized-blocks