【发布时间】:2011-07-22 07:54:55
【问题描述】:
我有两个使用延迟加载支持字段的内部属性,并在多线程应用程序中使用,因此我根据this MSDN article 实现了双重检查锁定方案
现在,首先假设这是一个合适的模式,所有示例都显示为实例创建单个锁对象。如果我的两个属性是相互独立的,那么为每个属性创建一个锁实例不是更高效吗?
我突然想到,为了避免死锁或竞争条件,可能只有一个。没有想到一个明显的情况,但我相信有人可以给我看一个......(显然,我对多线程代码不是很有经验)
private List<SomeObject1> _someProperty1;
private List<SomeObject2> _someProperty2;
private readonly _syncLockSomeProperty1 = new Object();
private readonly _syncLockSomeProperty2 = new Object();
internal List<SomeObject1> SomeProperty1
{
get
{
if (_someProperty1== null)
{
lock (_syncLockSomeProperty1)
{
if (_someProperty1 == null)
{
_someProperty1 = new List<SomeObject1>();
}
}
}
return _someProperty1;
}
set
{
_someProperty1 = value;
}
}
internal List<SomeObject2> SomeProperty2
{
get
{
if (_someProperty2 == null)
{
lock (_syncLockSomeProperty2)
{
if (_someProperty2 == null)
{
_someProperty2 = new List<SomeObject2>();
}
}
}
return _someProperty2;
}
set
{
_someProperty2 = value;
}
}
【问题讨论】:
-
属性设置器是一种糟糕的代码气味。这里不止一种方式。
-
最后,我查看了我继承的代码并对其进行了重构,使其成为线程安全的,无需任何锁定。那么,到底最好的解决方案...
标签: c# object locking synchronized