首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“原子”在编程中意味着什么?

“原子”在编程中意味着什么?
EN

Stack Overflow用户
提问于 2013-02-24 16:57:37
回答 7查看 195.6K关注 0票数 343

在有效的Java书中,它指出:

语言规范保证读取或写入变量是原子的,除非变量类型为longdouble JLS,17.4.7。

在Java编程或一般编程中,“原子”意味着什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-02-24 17:07:55

下面是一个示例:假设foolong类型的变量,那么下面的操作不是原子操作(在Java中):

代码语言:javascript
复制
foo = 65465498L;

实际上,变量是使用两个单独的操作编写的:一个操作写前32位,第二个操作写最后32位。这意味着另一个线程可能读取foo的值,并查看中间状态。

使操作原子化包括使用同步机制,以确保从任何其他线程来看,操作都是一个单独的原子操作(即不能分割成几个部分)。这意味着任何其他线程,一旦操作是原子化的,就会在赋值之前或之后看到foo的值。但从来没有中间值。

这样做的一个简单方法是使可变挥发性

代码语言:javascript
复制
private volatile long foo;

或同步对变量的每次访问:

代码语言:javascript
复制
public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

或者用AtomicLong替换它

代码语言:javascript
复制
private AtomicLong foo;
票数 448
EN

Stack Overflow用户

发布于 2014-06-25 13:25:19

“原子操作”是指从所有其他线程的角度看来是瞬时的操作。当担保适用时,您不需要担心部分完成的操作。

票数 87
EN

Stack Overflow用户

发布于 2013-02-24 17:00:30

它是“系统的其他部分似乎是瞬间发生的”,在计算过程中属于线性化性的范畴。为了进一步引用这一链接条款:

原子性是与并发进程隔离的保证。此外,原子操作通常有一个成功或失败的定义--它们要么成功地改变系统的状态,要么没有明显的效果。

因此,例如,在数据库系统的上下文中,可以有“原子提交”,这意味着您可以将更新的更改集推送到关系数据库,而这些更改要么全部提交,要么在发生故障时完全不提交,这样数据就不会损坏,锁和/或队列的结果,下一个操作将是不同的写入或读取,而只是在事实发生之后。在变量和线程的上下文中,这在内存中是相同的。

你的报价强调,在所有情况下,这并不一定是预期的行为。

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

https://stackoverflow.com/questions/15054086

复制
相关文章

相似问题

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