【问题标题】:How to explain atomic actions?如何解释原子动作?
【发布时间】:2012-01-07 18:56:36
【问题描述】:

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

我的理解是,在编程中,原子动作是一种有效地同时发生的动作。原子动作不能在中间停止,它要么完全发生,要么根本不发生。

例如,在线订购机票需要两个操作:付款和座位预订。潜在乘客必须要么。

  1. 支付并预订座位,或者
  2. 既不支付也不预订座位

【问题讨论】:

标签: java concurrency atomic


【解决方案1】:

您的解释,恕我直言,而是解释了关于数据库事务的原子性意味着什么:ACID 中的 A。

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

例如,更改 long 变量的值不是原子操作。它涉及设置前 32 位的值,然后设置最后 32 位的状态。如果对 long 变量的访问没有正确同步,线程可能会看到中间状态:前 32 位已更改,但后 32 位尚未更改。

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

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

【讨论】:

  • 非常感谢,这完美地回答了我的问题,并且您的示例很容易理解。
  • 您区分数据库事务中的原子性和编程中的原子性的第一句话是正确的。下面几乎所有其他答案(以及 OP 问题的一些 cmets)都忽略了这一点,与数据库事务无关。
【解决方案2】:

也许您应该考虑交易。进行一些处理,但在一切正常之前不要保存更改。就像你从机器上取钱一样,在看到你的账户发生变化之前,你需要遵循一系列步骤,即输入你的卡、你的密码、说出你想要多少钱、收款。如果其中一个步骤出现故障,您的储蓄账户将看不到变化,例如您的密码不正确,或者您试图提取的钱多于您的资金......

您可以阅读 java 教程。 http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

【讨论】:

  • 您的回答将数据库事务原子性与编程原子性混淆了。看第一个答案
【解决方案3】:

嗯,不是原子动作不能在中间停止。更多:所有他的效果在动作完成时变得可见(提交)或根本不可见(中止/回滚);所以可以停止,但系统状态不会更新。

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      原子性 - 意味着在事务中,要么执行所有语句,要么不执行任何语句。

      如果一个事务有 5 个语句。如果在所有语句运行之前发生故障,那么原子性意味着要么执行了 5 个语句,要么没有一个语句被执行。

      【讨论】:

      • 请注意拼写。你的答案很难读。
      • 对不起,我在这里使用快捷方式......transctn 用于交易..extcd 用于执行
      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 2015-12-29
      • 2023-04-02
      • 1970-01-01
      • 2020-05-15
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多