作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据维基百科:内存屏障,也称为 membar、内存栅栏或栅栏指令,是一种栅栏指令,它导致中央处理单元 (CPU) 或编译器对在屏障指令。 这通常意味着在屏障之前发出的操作保证在屏障之后发出的操作之前执行。
通常,文章谈论类似(我将使用监视器而不是 membars):
class ReadWriteExample {
int A = 0;
int Another = 0;
//thread1 runs this method
void writer () {
lock monitor1; //a new value will be stored
A = 10; //stores 10 to memory location A
unlock monitor1; //a new value is ready for reader to read
Another = 20; //@see my question
}
//thread2 runs this method
void reader () {
lock monitor1; //a new value will be read
assert A == 10; //loads from memory location A
print Another //@see my question
unlock monitor1;//a new value was just read
}
}
最佳答案
我在下面的回答仅针对 Java 的内存模型。确实不能为所有语言做出答案,因为每种语言可能会以不同的方式定义规则。
But I wonder is it possible that compiler or cpu will shuffle the things around in a such way that code will print 20? I don't need guarantee.
A = 20
的商店是否可以在解锁监视器上方重新排序?”
writer
如果第一个操作是
MonitorExit
第二个操作是
NormalStore
.网格解释说,是的,这个序列被允许重新排序。
关于multithreading - 乱序执行和重新排序 : can I see what after barrier before the barrier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519821/
我是一名优秀的程序员,十分优秀!