hotspot/src/share/vm/runtime/mutex.cpp
// Currently notifyAll() transfers the waiters one-at-a-time from the waitset
// to the cxq. This could be done more efficiently with a single bulk en-mass transfer,
// but in practice notifyAll() for large #s of threads is rare and not time-critical.
// Beware too, that we invert the order of the waiters. Lets say that the
// waitset is "ABCD" and the cxq is "XYZ". After a notifyAll() the waitset
// will be empty and the cxq will be "DCBAXYZ". This is benign, of course.
bool Monitor::notify_all() {
(コメントによると,
現状の Monitor::notify_all() ではスレッドを一つずつ notify() している.
まとめて処理するように変えればさらに効率よくできるけど,
そもそもたくさんのスレッドが wait しているケースが稀だし, あんまり性能上重要でもない.
ついでに, waitset に並んでいた順番と cxq に並んだときの順番が逆になるけど,
これも当然ながらたいした問題じゃない,
とのこと.)
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert (_owner == Thread::current(), "invariant") ;
assert (ILocked(), "invariant") ;
{- -------------------------------------------
(1) _WaitSet が空になるまで Monitor::notify() を呼び続けるだけ.
---------------------------------------- -}
while (_WaitSet != NULL) notify() ;
return true ;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.