0

我有一个具有受保护方法的抽象类。我在这个方法中使用字典。这个类有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; 
    } 

回答

2

是的,由于该方法中的字典是在该方法本身内的每个线程创建的,因此您使用Dictionary是线程安全的。当然,这并不意味着在方法返回之后在方法外部使用它自动是线程安全的。

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

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

+0

感谢澄清约阿希姆。关于这个._Queue,它不是一个静态变量。我设置它在其他方法如下public void ProcessQueue(Queue queue){this._Queue = queue;}我想这将创建每个线程的新_Queue对象,因此它是安全的。如果我错了,请纠正我。 –

+1

这很大程度上取决于系统设计中未在您的问题中显示的部分。多个线程可以同时在同一个对象中运行吗?如果是这样,不一定是线程安全的,因为线程在设计时会使用相同的_Queue引用。相同的队列可以传递给多个对象吗?同样的事情,不一定是线程安全的,因为多个对象的_Queue变量可能指向相同的队列。在一个对象实例中保留一个线程,远离静态并确保不将共享对象传递给多个实例通常会保证您的安全。 –

0

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

0

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

对于线程安全集合,请参见​​类。

我希望这会有所帮助。