多线程写入相同的布尔值

Osa*_*ved 5 java concurrency

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

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

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

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

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

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

Gra*_*ray 4

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

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

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