使用Class Lock同步属性访问

时间:2015-02-11 10:02:45

标签: c# .net properties synchronization locking

请考虑以下代码

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;
        }
    }
}

提前致谢。

1 个答案:

答案 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