gpt4 book ai didi

c# - 使用私有(private)静态方法使单例线程安全?

转载 作者:太空宇宙 更新时间:2023-11-03 20:32:20 25 4
gpt4 key购买 nike

我有一个类,我想通过创建它的静态实例将其用作单例。当然我也希望它是线程安全的。

假设我没有共享任何私有(private)数据。但是如果我没记错的话,仍然存在调用静态对象实例的方法时,方法中的变量是跨线程共享的,结果不可预知的问题。

然而,当调用真正的静态方法时,会创建一个新的栈帧,因此无论如何它都是线程安全的(对自身而言)。再说一遍,如果我没记错的话。

这种单例模式是线程安全的吗?

class Singleton
{
public object SomeMethod(object arg) {
return Singleton.SomeMethodImpl(arg);

}
private static object SomeMethodImpl(object arg) {
// is in unique stack frame?
object Result;
...
return Result;
}
}

如果您想知道为什么我不首先创建一个静态类 - 我需要有一个基于接口(interface)并具有不同实现的单例,作为策略模式的一部分。这不适用于静态类。

最佳答案

只要您的方法不是从实例方法或全局范围变量获取状态,您的方法就是可重入的和线程安全的。它不一定必须是静态的。所以像这样:

int AddTwo(int a, int b)
{
return a + b;
}

这是完全线程安全的,可以随心所欲地调用。即使在方法内部定义变量也可以,只要它们是方法之间共享的实例变量即可。

一种方法,例如:

string ReverseString(string s)
{
char[] charArray = s.ToCharArray();
Array.Reverse( charArray );
return new string( charArray );
}

上述方法也是可重入和线程安全的。

一旦您开始添加来自不同范围的静态变量或实例变量,您就会开始遇到线程安全问题。

class BadExample
{
private int counter;

private void IncrementCounter()
{
++counter;
}
}

在上面的例子中,IncrementCounter() 方法不是线程安全的。

关于c# - 使用私有(private)静态方法使单例线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com