我想要原子读取和原子写入Integer(非int)和其他如下:
volatile Double a; // not double
volatile Long b; // not long
Integer c; // not int
Boolean d; // not boolean
Run Code Online (Sandbox Code Playgroud)
如果没有,我将如何使它们原子化?
编辑:作为澄清,我不需要结合读写的原子操作.我只需要将读取原子化并将写入分别作为原子.
编辑2:@Peter Lawrey,@ PeterLawrey,这很讽刺:
Double a;
a = 0.5d;这里写的是原子的,因为它a是一个参考.在此期间
double a;
a = 0.5d;,写入不保证是原子的.然而Double包装了一个double.当然,我不希望将相同的内容应用于具有原子读取和写入引用的任意对象的包装内容.
编辑3:补充说明,我原本想要获得原子读写,认为原子性确保了跨线程的一致性.我发现它没有,你仍然需要波动.
对引用的所有读取或写入都是原子的.
我假设你的意思是你想要原子地进行读取和写入.在这种情况下,我会使用AtomicReference,AtomicLong,AtomicInteger或AtomicBoolean作为适当的.如果性能对您很重要,我会使用int long或double代替包装器.
对于线程之间的一致性需要volatile.对于增量和交换等原子操作,可以使用AtomicReference,AtomicReferenceFieldUpdater,AtomicLong,AtomicInteger,AtomicBoolean,AtomicIntegerArray,AtomicIntegerFieldUpdater和AtomicLongArray AtomicLongFieldUpdater类.要在a上执行此类原子操作double,您可以使用Unsafe构建自己的更新程序,但使用风险自负.;)
| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |