我想问几个关于在.Net中使用Monitor Class的问题。
要了解这些问题,请查看以下代码。
public class MyClass
{
private List<int> _MyCollection = new List<int>();
public void GetLock()
{
Monitor.Enter(_MyCollection);
}
public void ReleaseLock()
{
Monitor.Exit(_MyCollection);
}
public void UpdateCollection(/*anyparam*/)
{
//update collection without lock on collection
}
}
public class MyAppMain
{
private static MyClass myclass = new MyClass();
public static void main(args)
{
try
{
myclass.GetLock();
//an operation that does not do any update on myclass but wanted
//to ensure that the collection within myclass never update
//while its doing following opetion
//Do somthing
}
finally
{
myclass.ReleaseLock();
}
}
}
现在这是监视器的正确使用,我是否需要使用Pulse或PulseAll来发出等待线程的信号,如果是,则应该在Exit函数之前或之后使用加号?
此致 Mubashar
答案 0 :(得分:2)
获取锁定然后在finally块中释放它是正确的。我会在try块启动之前获得锁定,但除非尝试获取锁定而抛出异常,否则它可能不会造成任何损害。
对于您实际想要做的事情,您需要重新考虑您的目标是什么。根据性能是否值得关注,您可以查看ReaderWriterLock
。如果争用率很低,请考虑锁定每个操作,但使用自旋锁 - 这对于不会重叠但可能不会重叠的操作来说非常便宜。
另外:我认为你需要重新审视更新集合而不锁定的概念,除非你能确保只有一个线程会更新集合。
答案 1 :(得分:2)
是的,您对Monitor的使用是正确的。
也就是说,您可以使用lock
语句使代码更简洁:
public static void main(args)
{
lock(myclass)
{
}
}