hotspot/src/share/vm/runtime/mutex.cpp
int Monitor::TryLock () {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
intptr_t v = _LockWord.FullWord ;
{- -------------------------------------------
(1) ロックを無事取得できるかあるいは(他人が取っているので)諦めるまで
次の for ループを繰り返す.
ループ内での処理は以下の通り.
(1) _LockWord の値を確認する.
(2) もし _LBIT ビットが既に立っていたら, (他のスレッドがロックを取っているので) 諦めてリターンする
(ロックは取れなかったので 0 をリターン).
(2) 逆に _LBIT がまだ立っていなければ, _LBIT ビットを立てた値を CASPTR で _LockWord に書き戻すことを試みる.
成功したら, ここでリターン (ロックが取れたので 1 をリターン).
失敗したら, _LockWord の値の確認に戻ってやり直し.
---------------------------------------- -}
for (;;) {
if ((v & _LBIT) != 0) return 0 ;
const intptr_t u = CASPTR (&_LockWord, v, v|_LBIT) ;
if (v == u) return 1 ;
v = u ;
}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.