【发布时间】:2010-09-21 16:33:28
【问题描述】:
我有一堆属性,我将在这些属性上使用读/写锁。我可以使用try finally 或using 子句来实现它们。
在try finally 中,我将在try 之前获取锁,并在finally 中释放。在using 子句中,我将创建一个类,该类在其构造函数中获取锁,并在其 Dispose 方法中释放。
我在很多地方都使用读/写锁,所以我一直在寻找可能比try finally 更简洁的方法。我很想听听一些关于为什么一种方法可能不被推荐,或者为什么一种方法可能比另一种更好的想法。
方法一(try finally):
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
rwlMyLock_m .AcquireReaderLock(0);
try
{
return dtMyDateTime_m
}
finally
{
rwlMyLock_m .ReleaseReaderLock();
}
}
set
{
rwlMyLock_m .AcquireWriterLock(0);
try
{
dtMyDateTime_m = value;
}
finally
{
rwlMyLock_m .ReleaseWriterLock();
}
}
}
方法二:
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
using (new ReadLock(rwlMyLock_m))
{
return dtMyDateTime_m;
}
}
set
{
using (new WriteLock(rwlMyLock_m))
{
dtMyDateTime_m = value;
}
}
}
public class ReadLock : IDisposable
{
private ReaderWriterLock rwl;
public ReadLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireReaderLock(0);
}
public void Dispose()
{
rwl.ReleaseReaderLock();
}
}
public class WriteLock : IDisposable
{
private ReaderWriterLock rwl;
public WriteLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireWriterLock(0);
}
public void Dispose()
{
rwl.ReleaseWriterLock();
}
}
【问题讨论】:
-
就像许多答案中已经说过的那样,方法2非常好,但是为了避免每次使用锁时堆上的垃圾,您应该将ReadLock和WriteLock更改为结构。即使 using 语句使用结构的 IDisposable 接口,C# 也足够聪明,可以避免装箱!
标签: c# .net multithreading using-statement