java中的volatile,具有long、int、boolean和许多不同的写入情况

bfhwhh0e  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(392)

我在并行编程课上要考试了。这个类的结构相当好,但是我觉得我不能像我想的那样理解“volatile”关键字。我已经阅读了其他关于它是如何工作的文章,这似乎是有意义的,但我对java的整体理解限制了我。这些是练习题t/f,有人介意回答并解释一下为什么是真是假吗?我把我最好的猜测和解释放在
答____int变量count在多个线程之间共享,其中对count的唯一操作是读取它的值并使其递增。将count标记为volatile就足够了。
false,volatile关键字确保此变量没有本地缓存,但竞争条件仍然可能发生,因为新值依赖于前一个for count(因此该操作不是原子操作),因此两个线程可以读取该值,增加该值,并且在写回时仍然存在竞争条件。如果count不依赖于以前的值(例如只写了一个id号),这将起作用。
b、 \uuuu\uuu长变量count在多个线程之间共享,其中count的唯一操作是读取它的值并增加它。将count标记为volatile就足够了。
与上面一样,除了值不依赖于以前的值之外,这不是线程安全的,因为它从来不是原子操作,因为long需要两个写入周期来完成上下32位的写入和读取
c、 \uuuu\uuu布尔变量b(最初为false)在多个线程之间共享。一个特定线程将其值设置为true,其他线程读取该值。将b标记为挥发性就足够了。
是的,更改布尔值是原子的,可以在中断发生之前进行,并更新所有其他线程。
d、 \uuuu\uuu布尔变量b在多个线程之间共享。任何线程都可以设置或读取其值。一旦b被设为真,它就一直是真的。将b标记为挥发性就足够了。
是的,原因同上。
非常感谢!

gjmwrych

gjmwrych1#

问题d让我想起为什么我讨厌t/f问题。它看起来很像问题c,但是,如果你稍微改变一下,它将是一个完全不同的,有趣的问题:
e:boolean var,最初为false,任何线程都可以将其设置为true,但只能设置一次。
这就是所谓的一致性问题:线程如何选择其中的哪一个来设置标志?在这种情况下,单靠volatile是不够的。
共识问题是理解多重处理的基础。如果你不能解决一致性问题,那么你就不能有互斥,你就不能有多个消费者队列或多个提供者队列,。。。如果你不能解决一致性问题,那么你真的不能提供任何正确性保证。
问题d的作者有没有想到共识问题?当你的回答限制在t或f时,这是一个艰难的决定。

iaqfqrcu

iaqfqrcu2#

答。你的答案是好的(即volatile是不够的)
b、 ““它从来不是一个原子操作,因为long需要两个写入周期来进行上下32位的写入和读取“=>这对于非易失性变量来说太强了:非易失性long赋值可能是原子的,也可能不是原子的。它在64位处理器上通常是原子的,但java内存模型不能提供任何保证。然而,不稳定的长赋值保证是原子的。
c。你的回答很好(尽管我不明白你所说的“在中断发生之前”是什么意思)
d。你的回答很好

相关问题