如何在java中不使用wait()或sleep()的情况下使线程等待

2skhul33  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(240)

我正在写一个名为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();
       }

    }
gab6jxml

gab6jxml1#

if替换为while。您可以保持主体为空,即使建议休眠几毫秒。
原因是:你的方法acquire既不抛出异常也不返回结果(成功/失败),因此调用代码会假设当acquire调用完成时,线程可以继续执行敏感的工作。
所以你不能在没有锁的情况下退出这个方法,即使这意味着无限期的等待。一个更高级的方法允许定义一个超时,但是也需要通知是否获得了锁或者是否达到了超时。

相关问题