C# 锁定属性get/set
如果以下代码是安全的,则多个线程正在访问属性,但没有写入特定对象。正在创建和指定新对象。多线程调用C# 锁定属性get/set,c#,.net,C#,.net,如果以下代码是安全的,则多个线程正在访问属性,但没有写入特定对象。正在创建和指定新对象。多线程调用CreateXmlDoc和ReadXmlDoc public class DataHolder { public XmlDocument XmlDoc {get; set;} } public class AccessClass { DataHolder dataHolderInstance; public AccessClass(DataHolder _dataHold
CreateXmlDoc
和ReadXmlDoc
public class DataHolder
{
public XmlDocument XmlDoc {get; set;}
}
public class AccessClass
{
DataHolder dataHolderInstance;
public AccessClass(DataHolder _dataHolder)
{
dataHolderInstance = _dataHolder;
}
private void CreateXmlDoc()
{
XmlDocument _xmlDoc = new XmlDocument();
dataHolderInstance.XmlDoc = _xmlDoc;
}
private void ReadXmlDoc()
{
XmlNodeList elemList = dataHolderInstance.XmlDoc.GetElementsByTagName("title");
}
}
xml文档不是线程安全的。 要使此代码线程安全,请执行以下操作:
public class DataHolder
{
object lockObj = new object();
private XmlDocument _xmlDoc;
public XmlDocument XmlDoc
{
get{return GetXmlDoc();}
set{SetXmlDoc(value);}
}
private XmlDocument GetXmlDoc()
{
lock(lockObj) return _xmlDoc;
}
private void SetXmlDoc(XmlDocument xmlDoc)
{
lock(lockObj) _xmlDoc = xmlDoc;
}
}
public class AccessClass
{
DataHolder dataHolderInstance;
public AccessClass(DataHolder _dataHolder)
{
dataHolderInstance = _dataHolder;
}
private void CreateXmlDoc()
{
XmlDocument _xmlDoc = new XmlDocument();
dataHolderInstance.XmlDoc = _xmlDoc;
}
private void ReadXmlDoc()
{
XmlNodeList elemList = dataHolderInstance.XmlDoc.GetElementsByTagName("title");
}
}
从纯技术角度来看,您上面提供的代码不会出现任何线程安全问题(即数据损坏等)。。您必须问自己的问题是,从功能的角度来看,需要什么样的“线程安全”行为。access类中初始化的数据持有者实例在哪里?它是在访问类之间共享的吗?请重新措辞。多线程是否调用
CreateXmlDoc
?如果是的话。。那么不,它不是线程安全的。@SimonWhitehead是多线程调用CreateXmlDoc
我不确定是否有人可以评论这段代码是否是线程安全的,但我不知道并发读写操作所需的语义。我发布了一个答案,使其成为“线程安全的”。我建议你使用它,看看会发生什么。