C# 强制执行语句执行的顺序
我的问题是关于C#中的执行保证顺序(大概是一般的.Net)。我给出了一些我知道要比较的Java示例。
对于 Java(来自“Java Concurrency in Practice”)
不能保证一个线程中的操作将按照程序给出的顺序执行,只要无法从该线程中检测到重新排序,即使重新排序对其他线程是显而易见的。
所以代码
y = 10;
x = 5;
a = b + 10;
在分配 y = 10 之前,实际上可以分配 a=b+10
在Java中(来自同一本书)
当线程 A 启动由同一锁保护的同步块时,线程 A 在同步块中或之前执行的所有操作对线程 B 都是可见的。
所以在Java中
y = 10;
synchronized(lockObject) {
x = 5;
}
a = b + 10;
y = 10 和 x = 5 保证在 a = b + 10 之前运行(我不知道 y = 10 是否保证在 x = 5 之前运行)。
C# 代码对 C# 语句的执行顺序有什么保证
y = 10;
lock(lockObject) {
x = 5;
}
a = b + 10;
我对一个答案特别感兴趣,它可以提供明确的参考或其他一些真正有意义的理由,因为像这样的保证很难测试,因为它们是关于编译器被允许做什么,而不是它每次都做什么,因为当它们失败时,当线程以错误的顺序击中事物时,你将很难重现间歇性错误。