2011-11-15 57 views
2

我想读的原子和原子写入整数(不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。当然,我不希望同样的情况适用于原子读取和写入引用的任意对象的包装内容。编辑3:补充说明,我最初希望获得原子读取和写入,认为原子性确保跨线程的一致性。我发现它没有,你仍然需要波动。

回答

5

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

我假设你的意思是你想做一个阅读和写一个原子。在这种情况下,我会使用AtomicReference,AtomicLong,AtomicInteger或AtomicBoolean作为approriate。如果性能对您很重要,我会使用intlongdouble而不是包装。

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

+0

不,我只是指原子读。和一个原子写。他们不需要在一起。 – H2ONaCl

+0

所有参考访问都是原子的。唯一不能保证是原子的访问是非易失性访问'double'或'long' –

+0

请参阅编辑2。 – H2ONaCl