属性 访问与 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;
}
}
}
提前致谢。
您的第一个示例中的代码将同步访问 DataModel
中 StaticAccess
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);
}
请考虑以下代码
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;
}
}
}
提前致谢。
您的第一个示例中的代码将同步访问 DataModel
中 StaticAccess
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);
}