该变量应该被锁定吗?

时间:2017-08-15 15:51:08

标签: c# locking

我已经成为以下类的继承人,该类从文件系统加载XML文件,然后提供对XML的访问。这用于ASP.NET MVC应用程序。显然,意图是每个应用程序上下文只加载一次文档。 LoadXml方法中的错误名称参数xml实际上是一个完整路径 - c:\ a \ b \ c \ d \ file.xml

public class XmlParseService
{
    static XmlDocument xdoc;
    private static object lockobject = new object();

    internal static bool IsdocumentFound
    {
        get
        {
            return xdoc != null;
        }
    }
    internal static void LoadXml(String xml)
    {
        if (xdoc == null)
            xdoc = new XmlDocument();

        xdoc.Load(xml);
    }


    public static XmlNodeList GetNodes(string xpath)
    {
        if (xdoc == null)
            return null;

        lock (lockobject)
        {
            return xdoc.SelectNodes(xpath);
        }
    }

    public static String GetInnerText(string xpath)
    {
        if (xdoc == null)
            return String.Empty;

        lock (lockobject)
        {
            XmlNode node = xdoc.SelectSingleNode(xpath);
            if (node == null)
                return String.Empty;

            return node.InnerText;
        }
    }

    public static String GetAttributeText(string xpath, string attribute)
    {
        if (xdoc == null)
            return String.Empty;

        lock (lockobject)
        {
            XmlNode node = xdoc.SelectSingleNode(xpath);
            if (node == null)
                return String.Empty;

            return node.Attributes[attribute].InnerText;
        }
    }

    internal static void LoadXml(FileStream fileStream)
    {
        if (xdoc == null)
            xdoc = new XmlDocument();

        xdoc.Load(fileStream);
    }

    public static string[] GetValues(string xpath)
    {
        lock (lockobject)
        {
            XmlNodeList nodes = xdoc.SelectNodes(xpath);

            if (nodes == null)
                return new String[] { };

            string[] s = new string[nodes.Count];

            for (int i = 0; i < nodes.Count; i++)
                s[i] = nodes[i].InnerText;

            return s;
        }
    }

}

我无法在方法LoadXml中看到代码未被

包围的原因
lock (lockobject)
{
    ....
}

以及为什么if (xdoc == null)语句没有用lock语句包装。

他们应该吗?如果没有,为什么不呢?它确实需要使用lock语句吗?

1 个答案:

答案 0 :(得分:0)

  

我无法在方法LoadXml中看到代码未被[...]

包围的原因

据推测,来电者对这种情况有所了解。例如,可能是XML仅在应用程序的应用程序启动事件中加载,并且此时作者知道不会有任何其他线程试图访问该值。当然,加入锁定,即使你知道不会引起争论,也不是一个可怕的想法,因为拿出锁的绝对微不足道的成本并不是很大的回报。知道有人在他们不应该破坏代码时调用该方法的想法。

  

为什么if(xdoc == null)语句没有用lock语句包装。

这是一项优化。它不是真正的必要的,因为前面提到的锁定成本非常小,但在这种特殊情况下,由于引用的赋值是原子的,因此变量将是{{ 1}}或非空,由于正在进行的分配,它不会有无效值,所以虽然我不认为它是值得的优化,它看起来有效。