5

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

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

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

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

目前我使用同步来确保不会发生任何不好的事情。

但是,由于我在所有线程都完成处理之后读取标记的值。我可以摆脱同步代码吗?换句话说,当同时写入一个布尔变量时会出现什么问题吗?

4

5 回答 5

3

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

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

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

于 2013-06-04T12:50:25.503 回答
2

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

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

于 2013-06-04T12:49:00.127 回答
2

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

于 2013-06-04T12:49:51.107 回答
1

正如其他人所说,如果您只是尝试从多个线程将其设置为相同的值,则布尔值没有损坏或错误值的风险。

但是,您甚至可能不需要

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

您显然需要某种障碍来使协调线程与工作线程(例如Thread.join()CountdownLatch或您的原始 du jour )同步,并且几乎所有这些都已经提供了一种先发生关系,这将使您的所有标记对协调线程可见。

拥有单点同步也恰好比读取大量易失性更便宜(我不会称之为过早优化,只是省略了对易失性的需求)

于 2013-06-04T22:27:50.157 回答
0

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

于 2013-06-04T12:48:53.683 回答