我想知道以下结构是否是安全线程。我知道我应该同步所有访问enc
(读,写,添加/减少)。但我想知道布尔数组是否安全。它们通过许多不同的线程不断变化。我当然谈论数组元素而不是数组引用。
public class SimBox {
public static final int HP = 100;
public static final int LP = 35;
public static volatile boolean[] ins = new boolean[16];
public static volatile boolean[] outs = new boolean[16];
public static volatile int enc = 0;
}
注意:在这种情况下,我不需要重新初始化数组。我只读和写他们的元素。我想知道我是否应该宣布他们最终决定?!
它们用于什么?
模拟硬件/机械机器的运动。
outs
字段
ins字段的实时内容。 ins
值和其他一些外部因素更改enc
字段。 enc
或HP
来更新LP
。 enc
值,并为程序的其他部分做出决定或更改outs
。答案 0 :(得分:2)
volatile是否同步一组原子数据类型?
没有。但是,您的示例不使用原子数据类型。
我想知道以下结构是否是安全线程(原文如此)。
不,不是。有许多方法可以访问/更新不是线程安全的数据结构。
我想知道我是否应该宣布他们最终决定?!
这是一个好主意,但它不会使数组成为线程安全的。
如果要实现线程安全访问并更新到数组(不使用synchronized
),则应该查看原子数组类。其中有三个:AtomicIntegerArray
,AtomicLongArray
和AtomicReferenceArray
。您还可以使用AtomicBoolean
的普通(非同步)数组...只要数组安全地发布到线程并且永远不会被它们更新。
但我不清楚大量线程“随机”改变的原子数组是否可用于您的目的。首先,原子数组不提供获取数组的一致快照以进行分析的方法。实现这一目标的唯一方法是在您的(假设的)代码检查原子数组时“暂停”或“停止”所有线程。
如果您需要在不明确停止/暂停所有内容的情况下获得一致的快照,那么最好使用synchronized
而不是“原子”类型。