c# - 单例, 临界区

标签 c# java design-patterns

对于单例设计模式,人们应该更喜欢什么。

1)make whole getInstance() method synchronized 
OR
2)make only critical section synchronized.

应该采取什么方法,为什么?

最佳答案

首先,尝试考虑您是否需要惰性实例化。如果不是,则不涉及同步,因为您的 INSTANCE 将在类加载时初始化。

如果您确实需要延迟初始化您的实例,那么不要使getInstance 同步,因为这会导致您的所有线程无缘无故地相互等待一次实例已初始化。

如果您要在内部使用同步块(synchronized block),则需要仔细检查是否为 null(在同步块(synchronized block)的外部和内部)以确保您最终只有一个实例;此外,您需要您的实例是 volatile

最佳实践方法是拥有一个私有(private)嵌套类 SingletonHolder,它在加载时初始化您的单例实例(但仅在 getInstance() 时加载)调用容器类)。

但是,如果您不需要惰性实例化,最好的做法是使用具有一个常量的枚举。


长话短说,我想您会在这里找到所有内容:http://en.wikipedia.org/wiki/Singleton_pattern

关于c# - 单例, 临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12075451/

相关文章:

.net - Winform .NET 到 ASP.NET 项目的设计模式

java - 模型可以观察 View 吗?

java - 按顺序排列日期

java - 如何使用 aws-java-sdk 从 S3 中逐 block 读取文件

c# - 映射父亲枚举时生成子对象(Fluent Nhibernate)

Java - 消息处理器设计模式

java - 涉及交叉类型转换的设计模式的名称

c# - 从包含变量的C#执行多个Powershell命令

c# - 如何解决“"Unable to resolve service for type ' Microsoft.AspNetCore.Identity.UserManager”?

c# - 多重性与引用约束错误冲突