属性 访问与 Class 锁同步

Synchronization of property access with Class Lock

请考虑以下代码

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 静态字段引用检索?

换句话说,我可以使用上面的实现来同步对底层数据模型的属性的访问,还是我必须在它的每个 属性 中实现锁? 例如

public class DataModel
{
    private int _a;
    public int a {
    get {
        lock(this) {
            return _a;
        }
    }
    set {
        lock(this) {
            _a = value;
        }
    }
}

提前致谢。

您的第一个示例中的代码将同步访问 DataModelStaticAccess class 的实例(即:到_Data 字段),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 属性 StaticAccess returns DataModel 的实例。因此一次只有线程可以获得对该实例的引用。然而,目标是同步访问 DataModel.a。由于对 DataModel.a 的访问未同步,任何试图读取或写入 DataModel.a 的代码都未同步,这意味着访问 StaticAccess.Data.a 的多个线程未同步:

void ThreadProc1()
{
   // (might) block on "get StaticAccess.Data"
   // will not block on "DataModel.a = 20"
   StaticAccess.Data.a = 20;
}

void ThreadProc2()
{
    // (might) block on "StaticAccess.Data"
    // will not block on "DataModel.a = 10"
    StaticAccess.Data.a = 10;
    // (might) block on "StaticAccess.Data"
    // will not block on "DataModel.a"
    // "StaticAccess.Data.a" might be 10 or 20;
    Console.WriteLine(StaticAccess.Data.a);
}