【发布时间】:2011-09-07 16:35:46
【问题描述】:
默认情况下,当通过多个线程访问非静态方法时,每个线程都有自己的变量实例,因此如果它们不包含公共变量等,则它们是线程安全的。
另一方面,静态方法中的变量在线程之间共享,默认情况下它们是非线程安全的。
比如说,我有一个类,没有任何静态变量或方法。
public class Profile {
private ConcurrentDictionary<int, int> cache =
new ConcurrentDictionary<int, int>();
public AddToCache() {
}
public RemoveToCache() {
}
public DoSomethingThatShouldBeThreadSafe() {
}
}
然后我从这个类创建一个静态对象。
public static Profile objProfile = new Profile();
然后,objProfile 被多个线程访问。
问题是,Profile 类的 AddToCache、RemoveFromCache 和 DoSomethingThatShouldBeThreadSafe 的方法在通过 objProfile 使用时是否是线程安全的?它们的变量是否会在线程之间共享,即使它们不是静态的,因为类的整个实例都是静态的?
【问题讨论】:
-
你必须有非常特殊的非静态方法,可以神奇地增强所有成员变量的线程安全:)
-
公共静态 Profile objProfile = new Profile();不正确。
-
实际上我已经使用这个初始化多年了。你能澄清一下你认为不正确的地方吗?
标签: c# multithreading thread-safety concurrentdictionary