Top


定義場所(file name)

hotspot/src/share/vm/runtime/mutex.cpp

名前(function name)

int Monitor::TryLock () {

本体部(body)

  {- -------------------------------------------
  (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.