2014-10-05 4 views
0

다음 코드가 안전합니까? 여러 스레드가 속성에 액세스하고 있지만 특정 개체에 쓰지는 않습니다. 새 오브젝트가 작성되고 지정됩니다. 다중 스레드 CreateXmlDocReadXmlDoc잠금 속성 가져 오기/설정

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

} 
+0

데이터 홀더 인스턴스가 액세스 클래스에서 초기화되는 위치는 어디입니까? 액세스 클래스간에 공유됩니까? – Rup

+1

문구를 다시 작성하십시오. 여러 스레드가'CreateXmlDoc'을 호출합니까? 그렇다면 no이면 스레드로부터 안전하지 않습니다. –

+0

@SimonWhitehead 예 복수의 스레드가'CreateXmlDoc'를 호출합니다 – swiftcode

답변

0

를 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"); 
    } 
} 
1

을, 위에서 제공 한 같은 코드는 어떤 스레드 안전 문제 (즉, 데이터 손상 등) .. 당신은 스스로에게 물어야 할 질문을 나타내지 않을 것이다 기능적 관점에서 볼 때 어떤 "스레드 안전성"동작이 필요한지입니다.