我有一个多线程应用程序,它使用静态方法写入设置 xml 文件。我想避免文件同时更新两次(导致访问/写入异常)。
我怎么做?
这不起作用:
namespace Program
{
public class Settings
{
private static void SetSettingsValue (string settings, string value)
{
// make this thread safe to avoid writing to a locked settings xml file
lock (typeof(Settings))
{
//write data to xml file
}
}
}
}
您应该创建一个单独的静态锁定对象并使用它。不要使用绳子!字符串会自动驻留,并且每个以编程方式声明的字符串只有一个实例,因此您无法保证对锁的独占访问。
你应该做这个:
public class A {
private static Object LOCK = new Object();
private static void foo() {
lock(LOCK) {
// Do whatever
}
}
}
(语法可能不正确;我主要是 Java 人员,但有关锁定和字符串驻留的相同规则也适用于 C#)
lock 关键字强制执行互斥锁:一次只有一个线程可以锁定任何特定对象。如果第二个线程调用foo
然后它将阻塞,直到第一个线程退出锁块。
重要信息:静态方法锁定私有静态变量。不要锁定字符串或 typeof(...),因为您无法保证没有其他人正在使用该对象。通过将其设为私有并使其成为新对象,始终锁定您知道没有被其他人触及的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)