【问题标题】:How to ensure atomic reads and atomic writes?如何确保原子读取和原子写入?
【发布时间】:2011-11-15 12:48:36
【问题描述】:

我想要对 Integer(不是 int)和其他的原子读取和原子写入如下:

volatile Double a; // not double
volatile Long b; // not long
Integer c; // not int
Boolean d; // not boolean

如果不是,我如何让它们成为原子的?

编辑:澄清一下,我不需要结合读写的原子操作。我只需要分别进行原子读取和原子写入。

Edit2:@Peter Lawrey,@PeterLawrey,这很讽刺: Double a; a = 0.5d; 这里的写入是原子的,因为 a 是一个引用。而在这 double a; a = 0.5d; 不保证写入是原子的。然而Double 包装了double。当然,我不希望这同样适用于具有原子读取和写入引用的任意对象的包装内容。

Edit3:附加说明,我最初想获得原子读写,认为原子性可确保跨线程的一致性。我发现它没有,你仍然需要波动性。

【问题讨论】:

    标签: java atomic


    【解决方案1】:

    对引用的所有读取或写入都是原子的。

    我假设您的意思是您想以原子方式进行读取和写入。在这种情况下,我会使用 AtomicReference、AtomicLong、AtomicInteger 或 AtomicBoolean 作为适当的。如果性能对您很重要,我会使用 int longdouble 而不是包装器。

    为了线程之间的一致性,您需要volatile。对于增量和交换等原子操作,您可以使用 AtomicReference、AtomicReferenceFieldUpdater、AtomicLong、AtomicInteger、AtomicBoolean、AtomicIntegerArray、AtomicIntegerFieldUpdater 和 AtomicLongArray AtomicLongFieldUpdater 类。要在 double 上执行此类原子操作,您可以使用 Unsafe 构建自己的更新程序,但使用风险自负。 ;)

    【讨论】:

    • 不,我只是说原子读取。和原子写入。他们不需要在一起。
    • 所有引用访问都是原子的。唯一不能保证是原子的访问是对doublelong 的非易失性访问
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2011-02-03
      相关资源
      最近更新 更多