2

我看到很多关于被多个线程访问的静态方法以及它们的线程安全性的问题。我认为我在确保线程安全方面已经完成了大部分工作,但我不太确定的一件事是当您将“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

}

上面的例子是线程安全的吗?在静态方法中发生的所有处理都使用本地声明的变量,它只是从一个静态方法传递到另一个我不确定的 ref 对象。

4

3 回答 3

1

这不是关于static与否,而是关于这些方法操作的数据如何被隔离。

如果您对引用类型进行操作,则它不是线程安全的,因为它在两个示例的代码中都显示。

您需要使用一些锁定机制来确保线程安全。

于 2012-04-16T10:26:10.977 回答
0

在我看来,它本身是线程安全的,但当然,没有什么能阻止外部因素做奇怪的事情,比如多个线程使用相同的引用进行调用。一些开发人员说这可能是线程不安全的。可能是公共对象包含线程不安全的成员数据或可以访问此类数据的方法,但对我来说,这让你的问题有点极端。

也许只有我?

似乎我在过去 30 年中编写的几乎每个函数/过程都不是线程安全的,尤其是那些在多线程应用程序中工作的函数/过程。

于 2012-04-16T11:08:50.427 回答
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,我会假设这段代码是安全的,同时获得与你的代码相同的结果。

于 2012-04-16T11:19:32.603 回答