【发布时间】:2011-04-05 11:18:55
【问题描述】:
我有一个关于 C# 内存模型和线程的问题。如果没有 volatile 关键字,我不确定以下代码是否正确。
public class A {
private int variableA = 0;
public A() {
variableA = 1;
Thread B = new Thread(new ThreadStart(() => printA())).Start();
}
private void printA() {
System.Console.WriteLine(variableA);
}
}
我担心的是,如果不使用 volatile,线程 B 是否会看到值为 1 的变量 A?在主线程中,我只在构造函数中将 1 分配给 variableA。之后我不再接触变量A,它只在线程B中使用,因此可能不需要锁定。
但是,是否保证主线程会刷新他的缓存并将变量A的内容写入主内存,这样第二个线程才能读取新分配的值?
另外,是否保证第二个线程会从主内存中读取变量A的内容?可能会发生一些编译器优化,线程 B 可以从缓存而不是主内存中读取变量 A 的内容吗?当指令的顺序改变时可能会发生这种情况。
当然,将 volatile 添加到 variableA 声明将使代码正确。但是,有必要吗?我问是因为我在构造函数中编写了一些带有一些非易失性变量初始化的代码,这些变量稍后会被一些 Timer 线程使用,我不确定它是否完全正确。
Java 中的相同代码呢?
谢谢,米哈尔
【问题讨论】:
标签: c# java multithreading synchronization volatile