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