I가 나는 다음과 같은 방법으로 그것을 획득비교 및 스왑 잘못된 값
public boolean acquireLock(Long id) {
if (lock.compareAndSet(0L, id)) {
return true ;
}
return false ;
}
특정 사용자 ID와 객체를 잠그는 다음 코드를
: 같은 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 ;
}
}
잠금 개체를 다음과 같이 선언하십시오.
내가 함께 마무리되는 다음과 같은 이상한 행동과 교착 얻을 것을 제외하고 63,210private volatile AtomicLong lo = new AtomicLong(0);
:
아이디 (45)는 0
AK로, 락의 값을 취득하려고 체계적 0하지만 비교 및 스왑 테스트 루프가 종료 된 후 교착 상태를 테스트하는 카운터가 다시 초기화됩니다.
아이디어가 있습니까?
코드에서 잠금을 획득 할 때'this.getWorldID()'를 사용하지만 로깅에'this.id'가 사용됩니다. 이 문제를 해결하고 결과를 알려주십시오. – OldCurmudgeon
정말 항상 0입니까? 때때로 0이 될 것으로 예상 할 수 있습니다. 데드 록을 의미하는 것은 아니며 스핀 록이 다른 스레드에 의해 유지된다는 것입니다. 'AtomicLong'은 원자 적이지만 블록킹되지 않습니다. – kiheru
성공하면'count'를 0으로 설정하는 것을 기억하십니까? – OldCurmudgeon