Java同步迭代器?

标签 java synchronization

我正在寻找一种方法来调用从被调用对象(一个可迭代集合)返回的方法,其源(被调用对象中的集合实例)将阻止其他线程同时访问。

我想象这个可迭代集合将被包装在一个提供同步机制的类中,这样当调用者完成集合时,它可能会调用一个名为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/

相关文章:

java - 需要将 String month 作为 int 获取

java - 如何避免 Java 中的 switch-case 语句

java - 嵌入式 Jetty 是否能够设置过滤器的初始参数?

linux-kernel - 在 Uni 处理器(基于 ARM Cortex A8 的 SOC)上运行支持 SMP 的 Linux 内核是否有任何性能损失?

C# - 如何获得互斥量的所有者名称

java - Jenkins Selenium 作业未并行运行

c# - 哪种代码模式最适合处理周期性和可变的 Action 流

java - 当两个锁定的线程(通过变量)切换其中一个变量并尝试访问另一个变量时,会发生什么?

android - 在android的主线程中等待

java - 如何在 Lucene 4.4 中自定义停用词列表