如何理解在静态方法中的Lock()?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

我有一个多线程应用程序,它使用静态方法写入设置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
        }
    }
}

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

扫码关注云+社区

领取腾讯云代金券