嵌套CopyOnWriteArrayList默认是线程安全的吗?

问题描述 投票:0回答:1

假设我有以下代码:

class ClassA {
    final Integer i;
    final String;
    final CopyOnWriteArrayList<ClassB> l;
    ClassA() { ...
    }
}

class ClassB {
    final Integer i;
    final String;
    ClassB() { ...
    }
}

class ClassC {
    final CopyOnWriteArrayList<ClassA> cache = new CopyOnWriteArrayList<>();

    ClassA get() {
        return cache.get(...)
    }

    void updateV1() {
        cache.add(new ClassA(...))
    }

    void updateV2() {
        cache.get(...).l.add(new ClassB(...))
    }
}

对所有字段使用

final
关键字并制作所有列表
CopyOnWriteArrayList
本身是线程安全的吗?看起来
ConcurrentModificationException
没有问题,重新排序也无法打破状态?这是真的吗?或者我应该通过同步/锁提供一些额外的防御?

java concurrency
1个回答
0
投票

“线程安全”不是数据结构的属性。它是访问数据结构的代码的属性。当我们将

class
称为“线程安全”时,这是一种快捷方式,表示类的数据成员都是私有的,并且类的方法仅以线程安全的方式访问私有数据。

你的类没有真正的方法,*并且它们的数据成员都是有效的公共的。因此,只有询问“使用”类的代码的线程安全性才有意义。说类本身是线程安全的或非线程安全的没有任何意义。

*getter 和 setter 不对数据进行
操作

,它们只是将数据公开。

© www.soinside.com 2019 - 2024. All rights reserved.