请考虑以下代码
public class DataModel
{
public int a { get; set; }
}
public static class StaticAccess
{
private static _Data = new DataModel();
private static DataModel Data {
lock(_Data) {
return _Data;
}
}
}
对我们a
这样的属性StaticAccess.Data.a = 3;
的访问是否会锁定整个属性值赋值或仅针对_Data
静态字段引用检索?
换句话说,我可以使用上面的实现来同步对底层数据模型的属性的访问,还是我必须在它的每个属性中实现锁? e.g。
public class DataModel
{
private int _a;
public int a {
get {
lock(this) {
return _a;
}
}
set {
lock(this) {
_a = value;
}
}
}
提前致谢。
答案 0 :(得分:2)
第一个示例中的代码将同步对DataModel
类中{em> StaticAccess
实例的访问权限(即:_Data
字段),< em> not 给DataModel
本身的成员。为此你需要你的第二个例子。
附注:避免锁定this
,并使用专用对象锁定,因为您不知道还有谁可能锁定该实例。使用像
public class DataModel
{
private readonly object _lock= new object();
private int _a;
public int a {
get {
lock(_lock) {
return _a;
}
}
set {
lock(_lock) {
_a = value;
}
}
}
根据评论进行修改:
Data
的{{1}}属性返回StaticAccess
的实例。因此,一次只有线程可以获得对该实例的引用。然而,目标是同步对DataModel
的访问。由于访问DataModel.a
未同步,因此任何尝试读取或写入DataModel.a
的代码都不会同步,这意味着访问DataModel.a
的多个线程未同步:
StaticAccess.Data.a