【发布时间】:2014-04-05 12:35:57
【问题描述】:
我有一个有 3 个静态成员的类。每个静态成员都不是线程安全的单例。
我需要为他们的使用提供一个线程安全的实现。可以吗?或者我需要为他们每个人提供线程安全的包装器?如果我应该 - 我该如何使用Lazy<T>?
附加问题:SingeltonClass1/2/3 中的 Measure() 和 Do() 不是线程安全的 func1() 是线程安全的吗?
public class MyLazySingleton
{
// static holder for instance, need to use lambda to construct since constructor private
private static readonly Lazy<MyLazySingleton> _instance
= new Lazy<MyLazySingleton>(() => new MyLazySingleton());
// private to prevent direct instantiation.
private MyLazySingleton()
{
s_c1 = SingletonClass1.Instance();
s_c2 = SingletonClass2.Instance();
s_c3 = SingletonClass3.Instance();
}
// accessor for instance
public static MyLazySingletonInstance
{
get
{
return _instance.Value;
}
}
public void func1()
{
if (s_s1.Measure() || s_c2.Measure())
{
c_c3.Do();
}
}
static SingletonClass1 s_c1 = null;
static SingletonClass1 s_c2 = null;
static SingletonClass1 s_c3 = null;
}
如果 MyLazySingleton 的构造函数应该获得 2 个参数,我应该如何重新实现它? string str 和 int i
我已经问了一个后续问题Thread-safe methods in the singleton class
【问题讨论】:
-
我编辑了我的答案以包含您的其他编辑/问题。如果您还有其他问题,可能需要一个新的有针对性的问题。
-
我没有注意到您在底部编辑的 第三个 问题。您打算如何提供这些论点会影响答案。我建议您创建一个关于此的新问题特别。 (参数是编译时常量吗?你会更新你的
MyLazySingletonInstance来传递它们吗?用户会以某种方式指定它们吗?等等)
标签: c# multithreading lazy-evaluation