volatile是否同步一组原子数据类型?

时间:2013-12-24 00:53:19

标签: java arrays multithreading volatile atomicity

我想知道以下结构是否是安全线程。我知道我应该同步所有访问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字段。
  • 根据输出和输入线程,有一个唯一的线程可以通过添加/减去encHP来更新LP
  • 还有一些其他帖子读取enc值,并为程序的其他部分做出决定或更改outs
  • 所有这些数据在40ms后最多可读/写是非常重要的。否则就会出现一些异常现象。

1 个答案:

答案 0 :(得分:2)

  

volatile是否同步一组原子数据类型?

没有。但是,您的示例不使用原子数据类型。

  

我想知道以下结构是否是安全线程(原文如此)。

不,不是。有许多方法可以访问/更新不是线程安全的数据结构。

  

我想知道我是否应该宣布他们最终决定?!

这是一个好主意,但它不会使数组成为线程安全的。


如果要实现线程安全访问并更新到数组(不使用synchronized),则应该查看原子数组类。其中有三个:AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray。您还可以使用AtomicBoolean的普通(非同步)数组...只要数组安全地发布到线程并且永远不会被它们更新。

但我不清楚大量线程“随机”改变的原子数组是否可用于您的目的。首先,原子数组不提供获取数组的一致快照以进行分析的方法。实现这一目标的唯一方法是在您的(假设的)代码检查原子数组时“暂停”或“停止”所有线程。

如果您需要在不明确停止/暂停所有内容的情况下获得一致的快照,那么最好使用synchronized而不是“原子”类型。