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?
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.
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.notifyAll
to give all threads a chance to wake.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.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.