在一本关于编程的书中,我读到:
对于“无限”循环,应该有某种方式告诉线程不再需要它,例如通过AtomicBoolean标志。
如果它没有使用AtomicBoolean,而是拥有了volatile boolean,该怎么办?对于上述情况,使用AtomicBoolean而不是volatile boolean可以消除哪些负面影响?
如果我们将变量独占地用作线程终止的标志,那么AtomicBoolean和volatile boolean之间还有什么区别吗?
发布于 2014-05-08 14:41:34
使用AtomicBoolean,所有的读和写操作都是原子的(因为名称包括)。对于volatile boolean,当两个线程同时访问变量时,仍然需要处理争用条件。
发布于 2014-05-08 15:25:02
这取决于您的循环的具体实现细节和外部事件设置said停止标志。在实践中,如果可以确保只有一个线程更新易失性,则易失性就足够了。示例:
volatile boolean alive = true;
void loop() {
while (alive) {
}
}
void stop() {
alive = false;
}这很好,因为只有一种状态从true到false的状态转换。
一旦变得更加复杂(例如,反映循环状态的AtomicInteger ),您就需要compareAndSet()样式的操作来正确地实现变量的状态转换。
示例:
volatile int state = NOT_STARTED;
void loop() {
state = RUNNING;
while (state == RUNNING) {
}
state = TERMINATED;
}
void stop() {
state = ABORT;
}如果stop()在执行"state = with“之前被调用,这可能会丢失一个停止信号,因此这里需要compareAndSet来避免意外地覆盖运行中的中止。
发布于 2014-05-08 14:40:50
我认为比较集和getAndSet操作与易失变量不是原子操作。还请检查teto here给出的描述。
https://stackoverflow.com/questions/23544968
复制相似问题