在由线程更新时读取布尔数组

时间:2012-07-20 16:24:45

标签: java multithreading thread-safety

目前这似乎有效,但也许有一天它会发生错误:

我有一个布尔的2维数组,那些布尔表示各种对象的状态(如果它们已准备就绪或未被处理)

线程正在运行并生成这些对象,一旦创建了一个对象,它的布尔值就会设置为“true”(使对象最多占用20ms)。

我的问题是:

当线程正在发挥作用时,我能读取(仅读取)此数组吗? 如果线程在我的方法读取时写入为true会发生什么?

感谢。

2 个答案:

答案 0 :(得分:2)

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

最糟糕的事情是可见性。当一个线程更新给定变量但其他线程没有立即(或从不)看到该更改时,就会出现可见性问题。

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

答案 1 :(得分:1)

  

当线程正在发挥作用时,我能读取(仅读取)此数组吗?如果线程在我的方法读取时写入为true会发生什么?

是的,你可以读得很好,如果你尝试写它,你可能会发现自己处于困境。至于第二个问题,很简单,这是不可能的。你不能在它改变的同一时刻阅读那个索引。它要么等到写完成就要在写入之前读取任何内容。