Сбрасываемый отсчет

Рассмотрим следующую строку:

ab

Образец (ab.*) вернет совпадение для группы захвата с результатом ab

Пока шаблон (ab.+) не будет соответствовать и ничего не возвращать.

Но если вы измените строку на следующую, она вернет aba для шаблона (ab.+)

aba
16
задан Chris Dennett 10 March 2015 в 18:01
поделиться

1 ответ

public class ResettableLatch {
private static final class Sync extends AbstractQueuedSynchronizer {

    Sync(int count) {
        setState(count);
    }

    int getCount() {
        return getState();
    }

    protected int tryAcquireShared(int acquires) {
        return getState() == 0 ? 1 : -1;
    }

    public void reset(int count) {
        setState(count);
    }

    protected boolean tryReleaseShared(int releases) {
        for (;;) {
            int c = getState();
            if (c == 0)
                return false;
            int nextc = c - 1;
            if (compareAndSetState(c, nextc))
                return nextc == 0;
        }
    }
}

private final Sync sync;

public ResettableLatch(int count) {
    if (count < 0)
        throw new IllegalArgumentException("count < 0");
    this.sync = new Sync(count);
}

public void await() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
}

public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
    return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
}

public void countDown() {
    sync.releaseShared(1);
}

public long getCount() {
    return sync.getCount();
}

public void reset(int count) {
    sync.reset(count);
}
}

Это работало на меня.

0
ответ дан 30 November 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: