【问题标题】:Is the dictionary inside protected method thread safe?受保护方法线程中的字典是否安全?
【发布时间】:2012-09-25 11:26:11
【问题描述】:

我有一个具有受保护方法的抽象类。我在这个方法中使用字典。这个类有2个实现。这两个类都调用这个受保护的方法 一些操作。如果两个实现都在不同的线程中运行,那么受保护方法线程中的字典是否安全?

保护方法如下

protected Dictionary<string, string> GenerateParameterFromQueue()
    {
        Dictionary<string, string> parameters;
        string queueInput = this._Queue.QueueInput;
        string[] inputArray = Regex.Split(queueInput,Constants.KEY_DELIMITER); 

        parameters = inputArray.ToDictionary(s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[0], s => s.Split(Convert.ToChar(Constants.KEY_EQUALITY))[1]);

        return parameters;
    }

【问题讨论】:

    标签: c# multithreading c#-4.0 thread-safety task-parallel-library


    【解决方案1】:

    是的,因为方法中的字典是在方法本身内的每个线程中创建的,所以您对Dictionary 的使用是线程安全的。当然,这并不意味着在它被返回后在方法之外的任何使用都是自动线程安全的。

    只有当两个线程访问/更改单个Dictionary 时,您才会遇到问题。它与被保护的方法无关。

    我在方法中担心的是 this._Queue 变量,因为它在多个线程之间共享并且您没有锁定它,所以您需要确保它本身是线程安全的。

    【讨论】:

    • 感谢 Joachim 的澄清。关于this._Queue,它不是静态变量。我在其他方法中设置它,如下 public void ProcessQueue(Queue queue){this._Queue = queue;} 我猜这将为每个线程创建新的 _Queue 对象,因此它是安全的。如果我错了,请纠正我。
    • 这在很大程度上取决于您的问题中未显示的系统设计部分。多个线程可以同时在同一个对象中运行吗?如果是这样,则不一定是线程安全的,因为线程在设计上会使用相同的 _Queue 引用。可以将同一个队列传递给多个对象吗?同样的事情,不一定是线程安全的,因为几个对象的 _Queue 变量可能引用同一个队列。将一个线程保留在一个对象实例中,远离静态并确保不将共享对象传递给多个实例通常可以保证您的安全。
    【解决方案2】:

    字典是“线程安全的”,但不是因为它是受保护的方法。它是线程安全的,因为您是从头开始生成字典。

    【讨论】:

      【解决方案3】:

      protected 关键字仅表示该方法仅在包含类型或子类中可见。它使它成为线程安全的。 Dictionary 正在为对该方法的每个线程调用创建,这使得该示例中的 Dictionary 线程安全...

      有关线程安全集合,请参阅ConcurrentCollection 类。

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        相关资源
        最近更新 更多