public class TomUtil
{
static Hashtable Mutex = new Hashtable();
public static void SaveXmlFile(string xmlFile)
{
lock(Mutex){
if (Mutex[xmlFile] == null)
Mutex[xmlFile] = xmlFile;}
lock (Mutex[xmlFile])
{
DirectoryInfo folder = new FileInfo(xmlFile).Directory;
if (!folder.Exists)
folder.Create();
using (Stream writer = new FileStream(xmlFile, FileMode.Create))
{
...
}
}
}
}
1.这段程序有没有问题
2.需要改成这样吗:lock(Mutex){
if (Mutex[xmlFile] == null)
Mutex[xmlFile] = xmlFile;}
3.lock(Mutex)跟lock(Mutex[xmlFile])不会有冲突吧
如果使用Hashtable,同步的时候使用 lock (Mutex.SyncRoot);
也可以使用Hashtable的线程安全版本:static Hashtable Mutex = Hashtable.Synchronized(new Hashtable()),就不用显式Lock了。
Lock(Mutex) 会影响 Lock(Mutex[xmlFile]) ,比如当一个线程 A 已经 Lock(Mutex)后,此时另一个线程 B 想要去 Lock(Mutex[xmlFile]) ,这个时候,操作 Mutex[xmlFile] 会进入等待队列,因为 Mutex 已经被线程 A 占用。
在你的例程中,由于 Mutex[xmlFile] = xmlFile 操作耗时极短,这种现象不明显,如果你加上 Thread.Sleep(5000) ,你就会明显的感觉出差别。
所以,Lock(Mutex) 是没必要的,如果你不放心,你可以使用 Hashtable.Synchronized 创建 Mutex .
我个人觉得,lock (Mutex[xmlFile]) 没有必要。
在你的代码里lock(Mutex)的确有用,可以避免对Mutex[xmlFile]重复负值。