我希望原子读取和原子写入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:补充说明,我原本想要获得原子读取和写入,认为原子性确保了跨线程的一致性。我发现它没有,你仍然需要波动。
答案 0 :(得分:5)
对引用的所有读取或写入都是原子的。
我认为你的意思是你想要原子地进行读取和写入。在这种情况下,我会使用AtomicReference,AtomicLong,AtomicInteger或AtomicBoolean作为适当的。如果性能对您很重要,我会使用int
long
或double
而不是包装。
为了保证线程之间的一致性,您需要volatile
。对于增量和交换等原子操作,可以使用AtomicReference,AtomicReferenceFieldUpdater,AtomicLong,AtomicInteger,AtomicBoolean,AtomicIntegerArray,AtomicIntegerFieldUpdater和AtomicLongArray AtomicLongFieldUpdater类。要在double
上执行此类原子操作,您可以使用Unsafe构建自己的更新程序,但使用风险自负。 ;)
答案 1 :(得分:0)