特定のユーザー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 ではないと信じて失敗します (ループを終了した後、デッドロックをテストするためのカウンターが再初期化されます)。
何か案は?