- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个类,我想通过创建它的静态实例将其用作单例。当然我也希望它是线程安全的。
假设我没有共享任何私有(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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!