【发布时间】:2012-11-28 05:20:58
【问题描述】:
我有一个类及其属性;对这些属性的访问非常频繁由不同的线程完成。
为每个属性使用相同的对象(用于锁定语句)更有效?
private readonly object padlock = new object();
private string name;
private int age;
public string Name
{
get
{
lock(padlock)
return name;
}
set
{
lock(padlock)
name = value;
}
}
public int Age
{
get
{
lock(padlock)
return age;
}
set
{
lock(padlock)
age = value;
}
}
或者为每个属性使用不同的对象?
private readonly object padlockName = new object();
private readonly object padlockAge = new object();
private string name;
private int age;
public string Name
{
get
{
lock(padlockName)
return name;
}
set
{
lock(padlockName)
name = value;
}
}
public int Age
{
get
{
lock(padlockAge)
return age;
}
set
{
lock(padlockAge)
age = value;
}
}
第二个版本有意义吗?
【问题讨论】:
-
这取决于 - 您的属性是否链接在一起,不能同时读取和更改?
-
@MarcinJuraszek 否,但问题是如果一个线程正在读取/写入 Name 属性,则另一个线程必须等待才能读取/写入 Age 属性。这个等待时间(由于使用相同的对象)是相对较高还是使用相同的对象更好?
-
@LightStriker a) 如果类型是值类型,那么锁是没有价值的,由于装箱,你每次都会得到一个新的
objectb) 你打破封装,因为同一个对象(在string) 之类的引用类型的情况将被传出类,有人可以锁定它,然后导致代码死锁。 -
@Nick 我们无法回答这个问题,只有你可以。它强烈地基于类的使用方式。即使你也很难从概念上弄清楚。唯一实用的方法是对两者进行编码并分析结果。
-
@Servy 不幸的是我认为你是对的..
标签: c# multithreading locking