我有一节课:
class PrintStringDataBuilder
{
PrintStringDataBuilder() { }
public static GetInstance()
{
return new PrintStringDataBuilder();
}
//other class methods and fields, properties
}
Run Code Online (Sandbox Code Playgroud)
从客户代码访问:
PrintStringDataBuilder instance = PrintStringDataBuilder.GetInstance();
Run Code Online (Sandbox Code Playgroud)
以上是调用线程安全吗?
编辑:只是试图避免编写PrintStringDataBuilder builder = new PrintStringDataBuilder(); 在asp.net mvc web app中多次.PrintStringDataBuilder类中没有其他静态方法,静态字段或静态属性.
Tej*_*ejs 11
是?在不知道该类的构造函数的内部结构的情况下,您可以说调用GetInstance()是线程安全的.但是,该实例上的任何方法都不能保证是线程安全的,特别是因为您没有提供任何这些方法.
这简称为工厂模式.
编辑:如果你想要返回一个单身人士,你可以这样做:
.NET 4+
private static Lazy<PrintStringDataBuilder> _instance = new Lazy<PrintStringDataBuilder>(() =>
{
return new PrintStringDataBuilder();
});
public static PrintStringDataBuilder GetInstance()
{
return _instance.Value;
}
Run Code Online (Sandbox Code Playgroud)
.NET 3.5及更低版本
private static PrintStringDataBuilder _instance = null;
private static object _lockObject = new object();
public static PrintStringDataBuilder GetInstance()
{
if(_instance == null)
{
lock(_lockObject)
{
if(_instance == null)
_instance = new PrintStringDataBuilder();
}
}
return _instance;
}
Run Code Online (Sandbox Code Playgroud)
通过'threadsafe',您是否担心调用静态方法的多个线程将获得SAME PrintStringDataBuilder?答案是否定的,并且调用是线程安全的.
话虽如此,没有人可以从你给出的小片段中判断出其余的是否是它的构造函数.类实例不是线程安全的原因有很多.如果他们引用静态属性而没有锁定就是一个例子.
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |