Lock() in a static method
I have a multi threaded application that writes to a settings xml file using a static method. I want to avoid that the file is being updated twice at the same time (causing accesss/write exception).
How do I do that?
This doesn't work:
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
}
}
}
}
The concept of lock() is to use an existing-object it can reference and use to control whether access is granted.
static object SpinLock = new object();
lock(SpinLock)
{
//Statements
}
When the execution leaves the lock() block the reference is released and any other threads waiting to execute the code block can proceed (one at a time, of course).
You should create a separate, static lock object and use that. DO NOT USE A STRING! Strings are automatically interned and there will be only one instance of each programmatically declared string so you can't guarantee exclusive access to the lock.
You should do this:
public class A {
private static Object LOCK = new Object();
private static void foo() {
lock(LOCK) {
// Do whatever
}
}
}
(The syntax may be incorrect; I'm a Java person mostly but the same rules about locking and String interning apply to C#)
The lock keyword enforces a mutual exclusion lock: only one thread can lock any particular object at a time. If a second thread calls foo
then it will block until the first thread has exited the lock block.
Take home messages: for a static method lock on a private static variable. Don't lock on Strings or typeof(...) because you cannot guarantee that no-one else is using that object. Always lock on an object you know is not touched by anyone else by making it private and making it new.
链接地址: http://www.djcxy.com/p/21226.html上一篇: 如何在C#中将参数默认为DateTime.MaxValue?
下一篇: 在静态方法中锁定()