我正在使用HashMap来跟踪每个状态的计数器,并且试图使某些线程使用相同的状态块调用await(State s),直到该状态的计数器为0。每个线程都使用decrementCounter(State S),然后调用await(State)
我考虑过在锁中添加一个条件,但是我认为这没有任何意义,因为我可以在两个计数器上等待两组不同的线程,并且当一个线程对其中一个计数器使用signalAll()时,它将唤醒这两个组。 任何提示将不胜感激。
注意:计数器在我的代码的另一部分正在递增,但不相关。
在工作线程中:
private final static Counter counter = new Counter();
if (condition) {
counter.decrementCounter(s);
counter.await(s);
}
反类:
public class Counter{
private HashMap<State, Integer> count = new HashMap<State, Integer>();
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock writeLock = lock.writeLock();
private final Lock readLock = lock.readLock();
public void await(State s) throws InterruptedException {
readLock.lock();
try {
//check if state s counter is 0. if it's not 0 block until it is.
} finally {
readLock.unlock();
}
}
public void decrementCounter(State s) {
writeLock.lock();
try {
int temp = count.get(s);
if (temp > 0) {
count.put(s, temp - 1);
}
} finally {
writeLock.unlock();
}
}
}