こんなユースケースがあります。私のメソッドの 1 つは、List をパラメーターとして受け取ります。オブジェクトの少なくとも 1 つが他のスレッドによって既にロックされている場合にのみ、クリティカル セクションを保護する必要があります。java.util.concurrent パッケージを使用してどのように達成できますか? 次のような単純な HashTable ベースのソリューションを考えることができます
class ContainsCriticalSections {
HashTable<SomeObject, Thread> map; //shared by multiple threads
someCriticalMethod(List<SomeObject> objects) {
acquireLocks(objects);
//do critical task
releaseLocks(objects);
}
synchronized acquireLock(List<SomeObject> objects) {
bool canLock = false;
while (!canLock) {
for (SomeObject obj : objects) {
if (!map.contains(obj)) {
canLock = true;
}
else if(map.get(obj).equals(Thread.currentThread())) {// ensuring re-entrace
canLock = true;
}
else {
canLock = false;
}
}
if (!canLock) {
wait();
}
}
for (SomeObject obj : objects) {
map.put(obj, Thread.currentThread());
}
}
synchronized releaseLock(List<SomeObject> objects) {
for (SomeObject obj : objects) {
map.reomve(obj);
}
notify();
}
}
したがって、上記の場合、A、B、C と D、E、F を使用した 2 つの呼び出しがブロックされない場合。ただし、A、B、C と A、E、F はブロックします。
しかし、ここには確立されたパラダイムがあると強く感じています (java.util.Concurrent を使用)。