当前位置:  开发笔记 > 编程语言 > 正文

原子操作和多线程

如何解决《原子操作和多线程》经验,为你挑选了2个好方法。

最近我正在阅读一个教程,因为我发现了一个声明说...

"Java语言规范保证读取或写入变量是一个原子操作(除非变量是类型long或者double).类型的操作变量longdouble只有在用volatile关键字声明时才是原子的."

AtomicIntegerAtomicLong提供类似的方法getAndDecrement(),getAndIncrement()以及getAndSet()哪些是原子方法.

我对上述陈述感到困惑.你能澄清何时使用 AtomicIntegerAtomicLong上课.



1> JB Nizet..:

否则a = 28(与a作为一个int)是一个原子操作.但这样做a++不是原子操作,因为它需要读取a的值,增量和写入结果.因此,如果您曾经a++实现过一个线程安全计数器,那么您可以有两个线程同时读取该值(例如26),然后同时增加它并同时写入它,结果导致27,而不是28 .

AtomicInteger通过提供与您列出的原子操作类似的原子操作来解决此问题.在我的示例中,您将使用incrementAndGet()例如,这将保证结束值为28而不是27.


如果使用AtomicXxx,则不需要使用volatile,因为原子对象提供的保证比volatile更多.在易失整数上执行`a ++`不会使操作成为原子.它只保证另一个线程在增加后会看到a的新值.在为long或double值分配新值时,它还保证write是一个原子操作(因为写入非易失性long或double变量包括写入4个字节,然后写入其他4个字节).通常将原子对象优先于volatile变量.

2> Ren..:

原子意味着操作完成,没有任何可能发生的事情.例如.AtomicInteger上的getAndDecrement()保证变量同时返回和递减.

如果它不是原子操作,则可能存在值递减(例如从3到2),然后由另一个线程修改(例如,将其从2更改为5),然后返回为5.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有