多线程写入相同的布尔值

时间:2013-06-04 12:46:25

标签: java concurrency

我正在研究图形(节点和顶点)分区算法。

我使用多个线程来尝试识别图中的某些区域。

一旦节点被识别为区域的一部分,我就为节点对象设置boolean marked为真。

多个线程可以尝试同时标记同一节点。

目前我使用同步来确保没有发生任何不良事件。

然而,因为我从不读取所有线程完成处理后的标记值。我可以摆脱同步代码吗?换句话说,当同时写入布尔变量时,会出现什么问题吗?

5 个答案:

答案 0 :(得分:3)

  

同时写入布尔变量时会出现什么问题吗?

是和否。当然,结果值不会以某种方式被破坏,但是对于哪些更新在字段上设置以及何时其他线程看到这些更新(如果有的话)将是非确定性的。

如果有多个线程使用此布尔值进行决策,则必须在某个时刻提供内存同步。使字段volatile的成本非常低,除非您有证据表明它是性能问题,否则字段为volatile很可能是过早优化。如果您要进行比较和设置,则建议AtomicBoolean包裹volatile boolean并提供更高级别的方法,例如compareAndSet(...)

答案 1 :(得分:2)

理论上,不,但我不介意声明变量volatile。 Volatile关键字确保原子访问。

(假设写入的顺序无关紧要,所有读取都在所有写入之后发生。)

答案 2 :(得分:2)

不,当多个线程写入相同的布尔值时,没有什么可能出错,但是在稍后的另一个线程中可能存在读取值(甚至很长时间)的问题。您至少应该将变量标记为volatile以防止出现问题。

答案 3 :(得分:1)

正如其他人所说,如果您只是尝试将其设置为来自多个线程的相同值,则不存在损坏或布尔值不正确的风险。

但是,您甚至可能不需要

  

在所有线程完成处理之后,我从未读过标记的值。

你显然需要某种障碍来协调协调线程与工作线程(例如Thread.join()CountdownLatch或你的原始du jour)和几乎所有已经提供一个先发生过的关系,它将使所有标记对协调者线程可见。

具有单点同步也恰好比读取大量挥发物更便宜(我不会称之为过早优化,只是忽略了对挥发物的需求)

答案 4 :(得分:0)

没有。如果写入该变量的顺序无关紧要。