我有一个这样的用例。我的一种方法将 List 作为参数。当且仅当至少一个对象已被其他线程锁定时,我才需要保护关键部分。使用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 的两次调用不会阻塞。但是,A、B、C 和 A、E、F 会阻塞。
但是,我强烈认为这里会有一些既定的范例(使用 java.util.Concurrent)。