【发布时间】:2018-07-08 13:50:09
【问题描述】:
我已经搜索了这个问题,但我只找到了原始类型数组的答案。
假设我有一个名为 MyClass 的类,并且我想在我的另一个类中包含它的对象数组。
class AnotherClass {
[modifiers(?)] MyClass myObjects;
void initFunction( ... ) {
// some code
myObjects = new MyClass[] { ... };
}
MyClass accessFunction(int index) {
return myObjects[index];
}
}
我在某处读到,声明一个数组 volatile 不会给它的字段提供 volatile 访问权限,但给数组一个新值是安全的。 所以,如果我理解得很好,如果我在我的示例代码中给我的数组一个 volatile 修饰符,它会(有点?)安全。如果我从不通过 [] 运算符更改其值。
还是我错了?如果我想改变它的一个值,我该怎么办?我应该创建一个新的数组实例并在初始分配中用新值替换旧值吗?
AtomicXYZArray 不是一个选项,因为它只适用于原始类型数组。 AtomicIntegerArray 对 get() 和 set() 使用本机代码,所以对我没有帮助。
编辑 1: 我认为 Collections.synchronizedList(...) 可能是一个不错的选择,但现在我正在寻找数组。
编辑 2: initFunction() 是从不同的类调用的。 AtomicReferenceArray 似乎是一个很好的答案。到现在我都不知道。 (我仍然对我的示例代码将与 volatile 修饰符(在数组之前)一起使用仅从其他地方调用这两个函数感兴趣。)
这是我的第一个问题。我希望我能达到正式的要求。谢谢。
【问题讨论】:
-
“因为它只适用于原始类型数组”
AtomicReferenceArray有什么问题? -
如果您有内联代码问题,请编写正确的 Java 代码并添加 cmets。同样不清楚
initFunction是从构造函数还是其他地方调用的。 -
@LordWhy 我在问我的问题之前阅读了这个主题。它没有回答我的问题,但谢谢。
-
如果您使用的是 Java 9,则可以使用 MethodHandles.arrayElementVarHandle。
标签: java arrays multithreading object