0

特定のユーザーIDでオブジェクトをロックするための次のコードがあります

 public boolean acquireLock(Long id) {
   if (lock.compareAndSet(0L, id)) { 
    return true ; 
  }
  return false ; 
}

以下の方法で取得しています。

      while(!parent.acquireLock(id)){
        System.out.println(lock.get());
        if (count++>1000000) {
          System.out.println(id + " Trying to acquire " + lock.get());
          DebugHandler.createException("Error, deadlock");

        }
      }

次のようにリリースします。

public boolean releaseLock(Long id) { 

  if (lock.compareAndSet(id, 0)) {
    System.out.println("Releasing Lock for " + id);
    return true ; 
  }
  else { 
    DebugHandler.createException("Lock not owned by current view. Thief");
    return false ;
  }

}

そして、ロック オブジェクトを次のように宣言します。

 private volatile AtomicLong lo = new AtomicLong(0); 

ただし、次の奇妙な動作とデッドロックが発生し、次のようになります。

ID 45 0 を取得しようとしています

Ak、ロックの値は体系的に 0 ですが、比較とスワップのテストは 0 ではないと信じて失敗します (ループを終了した後、デッドロックをテストするためのカウンターが再初期化されます)。

何か案は?

4

1 に答える 1