在静态方法中锁定()

我有一个使用静态方法写入设置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
            }
        }
    }
}

lock()的概念是使用它可以引用并用来控制访问是否被授予的现有对象。

static object SpinLock = new object();

lock(SpinLock)
{
   //Statements
}

当执行离开lock()块时,参考被释放,并且等待执行代码块的任何其他线程可以进行(当然,一次一个)。


你应该创建一个单独的静态锁定对象并使用它。 不要使用字符串! 字符串会自动实现,每个程序声明的字符串只会有一个实例,所以您不能保证对锁的独占访问。

你应该做这个:

public class A {
    private static Object LOCK = new Object();

    private static void foo() {
        lock(LOCK) {
            // Do whatever
        }
    }
}

(语法可能不正确;我大多是Java人,但关于锁定和字符串实习的相同规则适用于C#)

lock关键字强制执行互斥锁:一次只有一个线程可以锁定任何特定的对象。 如果第二个线程调用foo则它将阻塞,直到第一个线程退出锁定块。

取回主消息:对私有静态变量进行静态方法锁定。 不要锁定字符串或typeof(...),因为您无法保证没有其他人正在使用该对象。 总是锁定一个你认为不被任何人触及的物体,将其隐藏起来并使其变为新的。

链接地址: http://www.djcxy.com/p/21225.html

上一篇: Lock() in a static method

下一篇: How to stop C# from replacing const variable with their values?