我正在写一个名为MyReentrantLock的类,我必须创建一个名为acquire()的函数,如果线程没有被锁定,那么它将被锁定,如果它确实被锁定,那么它必须等待,直到它解锁才能再次锁定它。这有点混乱,我不能使用wait()或sleep(),只能使用AtomicBoolean和Java中的Thread类。
public class MyReentrantLock implements Lock{
AtomicBoolean locked = new AtomicBoolean(false);
long IdOfThreadCurrentlyHoldingLock;
@Override
public void acquire() {
if(!locked.compareAndSet(false,true)){
WHAT DO I WRITE HERE!!
}
locked.compareAndSet(false, true);
IdOfThreadCurrentlyHoldingLock=Thread.currentThread().getId();
}
@Override
public boolean tryAcquire() {
if(!locked.compareAndSet(false,true))
return false;
else {
acquire();
return true;
}
}
@Override
public void release() {
locked.compareAndSet(true,false);
if(!locked.compareAndSet(true,false) || IdOfThreadCurrentlyHoldingLock!=Thread.currentThread().getId()){
throw new IllegalReleaseAttempt();
}
}
1条答案
按热度按时间gab6jxml1#
将
if
替换为while
。您可以保持主体为空,即使建议休眠几毫秒。原因是:你的方法acquire既不抛出异常也不返回结果(成功/失败),因此调用代码会假设当acquire调用完成时,线程可以继续执行敏感的工作。
所以你不能在没有锁的情况下退出这个方法,即使这意味着无限期的等待。一个更高级的方法允许定义一个超时,但是也需要通知是否获得了锁或者是否达到了超时。