首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicBoolean对易失性

AtomicBoolean对易失性
EN

Stack Overflow用户
提问于 2014-05-08 14:38:36
回答 3查看 4K关注 0票数 0

在一本关于编程的书中,我读到:

对于“无限”循环,应该有某种方式告诉线程不再需要它,例如通过AtomicBoolean标志。

如果它没有使用AtomicBoolean,而是拥有了volatile boolean,该怎么办?对于上述情况,使用AtomicBoolean而不是volatile boolean可以消除哪些负面影响?

如果我们将变量独占地用作线程终止的标志,那么AtomicBooleanvolatile boolean之间还有什么区别吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-08 14:41:34

使用AtomicBoolean,所有的读和写操作都是原子的(因为名称包括)。对于volatile boolean,当两个线程同时访问变量时,仍然需要处理争用条件。

票数 1
EN

Stack Overflow用户

发布于 2014-05-08 15:25:02

这取决于您的循环的具体实现细节和外部事件设置said停止标志。在实践中,如果可以确保只有一个线程更新易失性,则易失性就足够了。示例:

代码语言:javascript
复制
volatile boolean alive = true;

void loop() {
     while (alive) {
     }
}

void stop() {
    alive = false;
}

这很好,因为只有一种状态从true到false的状态转换。

一旦变得更加复杂(例如,反映循环状态的AtomicInteger ),您就需要compareAndSet()样式的操作来正确地实现变量的状态转换。

示例:

代码语言:javascript
复制
volatile int state = NOT_STARTED;

void loop() {
    state = RUNNING;
    while (state == RUNNING) {
    }
    state = TERMINATED;
}

void stop() {
    state = ABORT;
}

如果stop()在执行"state = with“之前被调用,这可能会丢失一个停止信号,因此这里需要compareAndSet来避免意外地覆盖运行中的中止。

票数 2
EN

Stack Overflow用户

发布于 2014-05-08 14:40:50

我认为比较集和getAndSet操作与易失变量不是原子操作。还请检查teto here给出的描述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23544968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档