作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些关于 volatile 变量的问题,这些变量不长, double
1.当我们写入和读取时,是否有可能出现竞争条件——例如,当我们读取一个 volatile 变量时,有人可以写入一个新值,而读取线程将无法获取更新后的值?
2.可以2个写入线程写入值,最后,其中一个将与另一个的结果重叠,也可以同时用多个线程读取 volatile ,这意味着读取线程重叠并且所有读取的结果相同同时结果?
3.如果我们在1个 volatile 变量上启动5个读线程和5个写线程,读者的结果是不可预测的?
最佳答案
是的。您不知道哪一个先发生,因此您的阅读线程会看到两个值之一。
如果你的意思是覆盖,当然。如果您有 2 次写入,则最后一次写入获胜。如果您的意思是重叠,就像结果值成为两次写入的组合一样,那么不会。即使使用 long
和 double
也不行。
当然。除非您有 volatile int foo = 0;
并且所有编写器都写入 0
。然后你就可以保证所有读者都会看到0
,否则这取决于日程安排和其他类似的事情。
您所有的问题看起来都像是您期望 volatile
与顺序有关,但事实并非如此。它只是保证可见性。如果你想要秩序,你就必须自己强制执行。
关于java - 易失变量语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427994/
考虑一个 C 函数(具有外部链接),如下所示: void f(void **p) { /* do something with *p */ } 现在假设 f 的调用方式使得 p 指向堆栈上 f 的
我是一名优秀的程序员,十分优秀!