我正在研究图形(节点和顶点)分区算法。
我使用多个线程来尝试识别图中的某些区域。
一旦节点被识别为区域的一部分,我就为节点对象设置boolean marked
为真。
多个线程可以尝试同时标记同一节点。
目前我使用同步来确保没有发生任何不良事件。
然而,因为我从不读取所有线程完成处理后的标记值。我可以摆脱同步代码吗?换句话说,当同时写入布尔变量时,会出现什么问题吗?
答案 0 :(得分:3)
同时写入布尔变量时会出现什么问题吗?
是和否。当然,结果值不会以某种方式被破坏,但是对于哪些更新在字段上设置以及何时其他线程看到这些更新(如果有的话)将是非确定性的。
如果有多个线程使用此布尔值进行决策,则必须在某个时刻提供内存同步。使字段volatile
的成本非常低,除非您有证据表明它是性能问题,否则字段为volatile
很可能是过早优化。如果您要进行比较和设置,则建议AtomicBoolean
包裹volatile boolean
并提供更高级别的方法,例如compareAndSet(...)
。
答案 1 :(得分:2)
理论上,不,但我不介意声明变量volatile
。 Volatile关键字确保原子访问。
(假设写入的顺序无关紧要,所有读取都在所有写入之后发生。)
答案 2 :(得分:2)
不,当多个线程写入相同的布尔值时,没有什么可能出错,但是在稍后的另一个线程中可能存在读取值(甚至很长时间)的问题。您至少应该将变量标记为volatile
以防止出现问题。
答案 3 :(得分:1)
正如其他人所说,如果您只是尝试将其设置为来自多个线程的相同值,则不存在损坏或布尔值不正确的风险。
但是,您甚至可能不需要
在所有线程完成处理之后,我从未读过标记的值。
你显然需要某种障碍来协调协调线程与工作线程(例如Thread.join()或CountdownLatch或你的原始du jour)和几乎所有已经提供一个先发生过的关系,它将使所有标记对协调者线程可见。
具有单点同步也恰好比读取大量挥发物更便宜(我不会称之为过早优化,只是忽略了对挥发物的需求)
答案 4 :(得分:0)
没有。如果写入该变量的顺序无关紧要。