hotspot/src/share/vm/runtime/mutex.cpp
int Monitor::TryFast () {
{- -------------------------------------------
(1) まずは _LockWord フィールドの値が 0 だと想定し,
CASPTR で値を 0 から _LBIT に変更することを試みる.
成功したら, ここでリターン (ロックが取れたので 1 をリターン)
---------------------------------------- -}
// Optimistic fast-path form ...
// Fast-path attempt for the common uncontended case.
// Avoid RTS->RTO $ coherence upgrade on typical SMP systems.
intptr_t v = CASPTR (&_LockWord, 0, _LBIT) ; // agro ...
if (v == 0) return 1 ;
{- -------------------------------------------
(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.