我已经看到很多关于多线程访问静态方法的问题以及它们的线程安全性。我认为在确保线程安全方面我已经完成了大部分工作,但我不太确定的一件事是当你在静态方法本身中引入'ref'变量时。这是一个简短的例子:
public static string ProcessMessage(object msg)
{
string outcome = "";
Decrypt(ref msg);
// parse msg
return outcome;
}
private static void Decrypt(ref object msg)
{
// decrypt msg
}
以上示例是否是线程安全的?静态方法中发生的所有处理都使用本地声明的变量,它只是从一个静态方法传递给另一个我不确定的静态方法的参考对象。
答案 0 :(得分:1)
这不是static
,而是关于这些方法操作的数据是如何被隔离的。
如果您使用引用类型,则不线程安全,就像在两个示例中的代码中所示。
您需要使用一些锁定机制来确保线程安全。
答案 1 :(得分:0)
在我看来,它本身就是线程安全的,当然,没有什么可以阻止外部因素做出奇怪的事情,比如多个线程使用相同的引用调用。一些开发人员说这可能是线程不安全的。如果公共对象包含可以访问此类数据的线程不安全的成员数据或方法,那么这可能会让我的问题变得极端,对我而言。
也许只是我?
似乎我在过去30年中编写的几乎所有函数/过程都不是线程安全的,尤其是那些在多线程应用程序中工作的函数/过程。
答案 2 :(得分:0)
您的代码看起来根本不需要ref
参数。
您可以这样更改以确保安全:
public static string ProcessMessage(object msg)
{
string outcome = "";
object decryptedMsg = Decrypt(msg);
// parse decryptedMsg
return outcome;
}
private static object Decrypt(object msg)
{
object processedMsg;
// decrypt msg into processedMsg
return processedMsg;
}
由于Decrypt
是私有的,msg
是object
,因此我认为此代码在您获得与代码相同的结果时是安全的。