首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保原子读取和原子写入?

如何确保原子读取和原子写入?
EN

Stack Overflow用户
提问于 2011-11-15 20:48:37
回答 2查看 454关注 0票数 2

我希望原子读取和原子写入到Integer (不是int)和其他,如下所示:

代码语言:javascript
复制
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:另外请注意,我最初想获得原子读写,认为原子性可以确保线程之间的一致性。我发现它没有,你仍然需要波动性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-15 20:54:31

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

我想你的意思是你想以原子方式进行读写。在这种情况下,我会使用AtomicReference、AtomicLong、AtomicInteger或AtomicBoolean作为合适的选择。如果性能对您很重要,我会使用intlongdouble,而不是包装器。

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

票数 5
EN

Stack Overflow用户

发布于 2011-11-15 20:55:28

除非我弄错了,否则你不应该用吗?

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html

而不是?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8136562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档