如何解释原子操作?

7

什么是原子操作,为什么它们是必要的?另外,在Java中如何实现原子操作?

我的理解是,在编程中,原子操作是指有效地一次性发生的操作。原子操作不能在中途停止,它要么完全发生,要么根本不发生。

例如,在网上订购航空机票时,需要执行两个操作:付款和座位预订。潜在的乘客必须:

  1. 同时付款和预订座位,或者
  2. 既不付款也不预订座位

原子操作的实现可以使用Java提供的synchronized关键字或者java.util.concurrent.atomic包中提供的原子类。


7
听起来像是作业。 - Brian Roach
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html - Brian Roach
Wikipedia已经很好地涵盖了这个主题。 - Anko
5个回答

21

在我看来,您的解释更多地解释了数据库事务中原子性的含义:ACID中的A。

关于并发性,原子性意味着当一个线程修改某个对象(或一组对象)的状态时,另一个线程无法看到任何中间状态。它要么看到操作之前的状态,要么看到操作之后的状态。

例如,改变长整型变量的值不是一个原子操作。它涉及设置前32位的值,然后设置后32位的状态。如果对长整型变量的访问没有得到适当的同步,那么一个线程可能会看到中间状态:前32位已经被改变,但后32位还没有被改变。

实现原子操作的方法是使用同步。同步涉及使用

  • synchronized关键字
  • volatile关键字
  • 原子变量(AtomicInteger等)

非常感谢,你的回答完美地解决了我的问题,你的例子也很容易理解。 - user1014888
你在区分数据库事务中的原子性和编程中的原子性方面的第一句话非常准确。几乎所有下面的其他答案(以及对OP问题的一些评论)都忽略了这一点,并提到了与数据库事务无关的参考资料。 - Motorhead

3
也许你应该考虑使用事务。进行一些操作,但在确保所有步骤都正确无误之前不要保存更改。就像你从取款机提取现金时,需要按照一系列步骤操作,才能看到账户余额的变化。例如:插入你的卡、输入密码、选择提取金额、领取现金。如果其中一个步骤失败,例如密码错误或者尝试提取超过你的存款额的金额,就不会在你的储蓄账户中看到任何更改。
你可以阅读Java教程。 http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

你的回答混淆了数据库事务的原子性和编程原子性。请参考第一个答案。 - Motorhead

2

事实上,原子操作并不是不能在中途停止。更确切地说,所有的影响都会在操作完成(提交)时变得可见,或者根本不可见(中止/回滚),因此它可以被停止,但系统状态不会更新。


1

-1

原子性 - 意味着在一个事务中,要么所有语句都被执行,要么没有一条语句被执行。

如果一个事务有5个语句。如果在所有语句运行之前发生故障,则原子性意味着要么执行5个语句,要么不执行任何语句。


2
请注意你的拼写。你的回答很难读懂。 - Neil Masson
抱歉,我在这里使用了快捷方式......transctn代表transaction,extcd代表executed。 - Sai Teja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接