c# - 静态方法中的 Lock()

标签 c# locking

我有一个多线程应用程序,它使用静态方法写入设置 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,那么它将阻塞,直到第一个线程退出锁定 block 。

重要信息:用于私有(private)静态变量上的静态方法锁。不要锁定字符串或 typeof(...),因为您不能保证没有其他人在使用该对象。通过将其设为私有(private)并使其成为新对象,始终锁定您知道其他任何人都不会触及的对象。

关于c# - 静态方法中的 Lock(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4010543/

相关文章:

.net - 多个线程调用 UI 线程 : locking needed for form data?

Mongodb findAndModify原子性

c# - 列文本溢出列宽

c# - 使用 Moq 模拟构造函数?

c# - 如何在 C# VSCode 中重命名变量/方法及其中的所有引用?

c++ - 线程安全队列死锁

mysql - 通过显式排序避免死锁

c++ - 是否可以使用互斥锁只锁定数据结构的一个元素?

c# - Entity Framework 数据库首先是多对多

C# lambda 内容在被调用之前不会发生,对吗?另外,代码清理