首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >静态方法中的Lock()

静态方法中的Lock()
EN

Stack Overflow用户
提问于 2010-10-25 05:27:11
回答 2查看 39.3K关注 0票数 20

我有一个多线程应用程序,它使用静态方法写入设置xml文件。我希望避免文件同时更新两次(导致访问/写入异常)。

我该怎么做?

这不起作用:

代码语言:javascript
复制
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
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-25 05:44:50

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

代码语言:javascript
复制
static object SpinLock = new object();

lock(SpinLock)
{
   //Statements
}

当执行离开lock()块时,引用被释放,等待执行代码块的任何其他线程都可以继续执行(当然,一次一个)。

票数 37
EN

Stack Overflow用户

发布于 2010-10-25 05:42:03

您应该创建一个单独的静态锁对象并使用它。不要使用字符串!字符串被自动嵌入,并且每个以编程方式声明的字符串都只有一个实例,因此不能保证对锁的独占访问。

您应该这样做:

代码语言:javascript
复制
public class A {
    private static Object LOCK = new Object();

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

(语法可能不正确;我主要是Java用户,但是关于锁定和字符串内嵌的相同规则也适用于C#)

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

带回家的消息:用于私有静态变量上的静态方法锁。不锁定字符串或类型(...)因为您不能保证没有其他人在使用该对象。通过将其设置为私有对象并将其设置为新对象,始终锁定您已知的未被其他任何人接触的对象。

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4010543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档