2012-07-20 26 views
0

目前,这似乎是工作,但也许有一天它会错误:阅读布尔,而由一个线程正在更新数组

我有布尔的2维数组,这些布尔表示各种对象的状态(如果它们已准备好或不被处理)

一个线程正在运行并且正在生成这些对象,一旦一个对象被创建,其布尔值被设置为“true”(使一个对象最多需要20ms)。

我的问题是:

我可以读取(只读)这个数组,而线程是做它的魔力? 如果线程在我的方法读取时写入true,会发生什么情况?

谢谢。

+0

我认为这取决于您希望读取的“新鲜”程度。我试图提出一个解释,但这两个帖子一起可能会导致针对您的特定情况的解决方案。 http://stackoverflow.com/questions/2236184/how-to-declare-array-elements-volatile-in-java http://stackoverflow.com/questions/5173614/java-volatile-array – 2012-07-20 16:34:26

回答

2

写入boolean是原子的,所以您不会看到任何不一致。 longdouble的情况并非如此。

最糟糕的事情可能发生在你身上的是知名度。当一个线程更新给定变量时,会出现可见性问题,但其他线程不会立即(或从不)立即看到该更改。

为了确保所有线程看到相同的,最新的值,您必须使用某种同步或volatile字段。

+0

不错,在我的我不认为我会看到invonsistencies,只有一个线程,他的工作是将数据从磁盘加载到RAM中。 主程序循环正在检查每个周期是否准备好或不使用数据块。 – Eildosa 2012-07-20 16:58:20

+0

你知道制定一系列可变布尔值的策略吗?是否有必要有一个包装类的开销? – snapfractalpop 2012-10-03 00:46:24

+0

@snapfractalpop:如果还不存在,请打开另一个问题。 – 2012-10-03 06:52:47

1

我可以读取(只读)这个数组,而线程正在做它的魔法?如果线程在我的方法读取时写入true,会发生什么?

是的,你可以阅读它就好,如果你尝试写它,你可能会发现自己处于一个棘手的状况。至于第二个问题,很简单,这是不可能的。你不能在它正在改变的同一时刻读取该索引。它会一直等到写入完成后才读写。

相关问题