Java:当嵌套子对象处于 Activity 状态时锁定父对象(迭代器)

标签 java multithreading codenameone

我的问题是:在嵌套子项处于 Activity 状态期间,如何保持对父项的锁定?

我正在使用 Codename One 开发框架编写一个多线程 Java 应用程序,其中有一个父类和一个嵌套子类。子类的目的是充当 Vector 上的迭代器。现在我的理解是,当迭代器运行时, vector 不能改变。

这是一个非常简单的代码示例:

public class Parent<E> implements Collection<Object> {

    private Vector<Object> objectCollection;

    Parent() {
        this.objectCollection = new Vector<Object>();
    }

    public Child<Object> iterator() {
        return(new Child());
    }

    class Child implements Iterator<Object> {

        private int index;

        Child() {
            this.index = 0;
        }

        public boolean hasNext() {
            int size = this.objectCollection.size()
            if (size <= 0) return(false);
            if (this.index >= size) return(false);
            return(true);
        }

        public Object next() {
            Object temp = objectCollection.elementAt(this.index);
            this.index++;
            return(temp);
        }
    }

}

我想要做的是,在实例化嵌套类(迭代器)时,我希望锁定父实例,以便进入父实例的所有其他线程都将被阻止,直到具有迭代器的线程完成并释放它。

我对此进行了一些搜索并发现了以下问题:

Locking and synchronization between outer and inner class methods?

Acquiring inner-class lock using outer-class locks?

Programming a mutex in Java

Is there a Mutex in Java?

但是,这些并不完全符合我的场景。我唯一能想到的就是使用自旋锁,但在 Java 中也不推荐这样做。所以基本上,我正在寻找一种方法来做到这一点。我可以编写代码,我只需要解释一下要做什么。

编辑:

只有一个线程可以访问迭代器。我试图在迭代器处于 Activity 状态时阻止修改父级。

最佳答案

我认为ReentrantReadWriteLock可以实现你的场景;但更新集合时应该使用写锁;迭代集合时使用读锁;

关于Java:当嵌套子对象处于 Activity 状态时锁定父对象(迭代器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142788/

相关文章:

java - 多线程的良好实践

java - "Could not register destruction callback"警告消息导致内存泄漏?

c# - 在无锁的保证 64 位架构上实现长属性的线程安全原子访问器的最佳方法

java - Codenameone 构建服务器失败

codenameone - 导致android构建失败的警告

c# - 设置和实例化类级变量的正确方法是什么?

java - hibernate java.sql.SQLException : No value specified for parameter 1

c++ - 对C++多线程真的很困惑

java - LongAccumulator 没有得到正确的结果

java - 如何从代号为 ConnectionRequest 的 http 和不安全的 https 站点获取响应? Android 10 中的 http 和 https 问题(在 Google Pixel 中)