我正在寻找一种方法来调用从被调用对象(一个可迭代集合)返回的方法,其源(被调用对象中的集合实例)将阻止其他线程同时访问。
我想象这个可迭代集合将被包装在一个提供同步机制的类中,这样当调用者完成集合时,它可能会调用一个名为finished()的方法,该方法将释放底层集合上的锁目的。尽管 API 具有返回公共(public)集合的同步版本的方法,但似乎没有办法通过调用已完成的方法以编程方式释放锁; AFAICT 当包装器被垃圾收集时,锁似乎被释放。
Java SE API 中是否有任何东西可以做到这一点,或者我自己推出一些东西是否被认为足够简单?
感谢您的建设性意见。
最佳答案
将迭代器的引用传递回调用者并尝试在内部阻止其他方法直到调用者完成迭代器是不切实际的。如果调用线程由于某些错误而永远无法完成迭代怎么办?如果调用线程 1 然后将 ierator 引用传递给另一个线程 2,会怎么样。线程 2 可能会永远阻塞,因为线程 1 给了它一个线程 1 持有锁的对象!
调用线程需要成为主动获取和释放锁的参与者,或者您需要反转控制,而不是返回迭代器,而是接受您计划迭代的代码,以便您可以控制您的锁边界。
例如,
public class TestIt {
public static class ListWrapper<K> {
private List<K> list = new ArrayList<>();
public synchronized void add(K value) {
list.add(value);
}
public synchronized void executeOperation(Operation<K> operation) {
for (K k: list) {
operation.execute(k);
}
}
}
public static interface Operation<K> {
void execute(K value);
}
public static void main(String[] args) {
ListWrapper<String> strings = new ListWrapper<>();
strings.add("FOO");
strings.add("BAR");
strings.executeOperation(new Operation<String>() {
@Override
public void execute(String value) {
System.out.println(value);
}
});
}
}
关于Java同步迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33029181/