リソース プールのコンテキストで ReentrantLock の条件をいじっています。スレッド通信が簡素化されていることがわかります。私の質問は、私は、acquiratedMapEmpty、freeQueueNotEmpty、待機中の変更、単一の異なるものなどの奇妙な条件を有機的に書くことになるということです。技術的には、それらはすべて 1 つの条件付きで置き換えることも、複数の条件付きに分割することもできます。経験則は次のとおりです。
- 条件の識別
- 多すぎるか少なすぎるかを把握する
- 正しい軌道に乗っているとき、またはコースから外れているとき
リソースを削除する例を次に示します。
public boolean remove(R resource) throws InterruptedException {
System.out.println("Remove, resource: " + resource + " with thread: " + Thread.currentThread().getName());
if (resource == null) {
throw new NullPointerException();
}
mainLock.lock();
try {
if (!isOpen) {
throw new IllegalStateException("Not open");
}
Object lock = locks.get(resource);
if (lock == null) {
return false;
}
if (freeQueue.remove(resource)) {
locks.remove(resource);
if (!freeQueue.isEmpty()) {
freeQueueNotEmpty.signalAll();
}
return true;
}
while (!freeQueue.contains(resource)) {
change.await();
if (!isOpen) {
throw new IllegalStateException("Not open");
}
lock = locks.get(resource);
if (lock == null) {
return false;
}
}
if (freeQueue.remove(resource)) {
locks.remove(resource);
if (!freeQueue.isEmpty()) {
freeQueueNotEmpty.signalAll();
}
return true;
}
return false;
} finally {
mainLock.unlock();
}
}