【发布时间】:2016-04-25 22:09:29
【问题描述】:
我有一个关于无状态单身人士的问题。我还有一个关于状态单例的问题。
无状态单例服务是帮助实现可扩展性的好方法。构建我维护的项目的程序员基本上说不会有并发问题,因为“它只是代码”(即 Singleton 类)。这意味着该类没有类级别的变量。这只是方法。
这就是我对 C# 的了解有点模糊的地方。是否存在两个用户通过单独的 Web 请求同时点击无状态单例的问题?他们能否同时采用相同的方法?这甚至可能吗?如果是这样,这是否意味着他们将在该方法中使用相同的局部变量?听起来很混乱,所以我假设它不可能发生。我假设方法调用永远不会被其他用户污染。
我问过很多同事这个问题,没有人知道答案。所以这是一个棘手的问题。
我关于单例的问题通常是 2 个或更多并发用户读取单例的公共属性是否有任何问题。我只对阅读感兴趣。如果属性不在锁定块内,是否有可能发生某种并发异常?或者并发、同时读取是否安全?我真的不想使用 lock 关键字,因为这是我不需要的性能损失。
谢谢
【问题讨论】:
-
无状态有利于并发;除了创建全局变量之外,单例对任何事情都没有好处。谷歌从他们的代码库中删除了单例。你为什么坚持宣传它们?
-
如果同时对同一个方法进行两次调用,每次调用都将拥有自己的堆栈和自己的一组局部变量。您只需要担心与共享变量的并发。
-
你说“网络请求”,这是asp.net的东西吗?
Lazy<>singleton 是线程安全的(我只是不明白你的问题的其余部分)。 -
@duffymo 我已经使用具有单例生命周期的服务一年了。它似乎运作良好,并且不难使用。您只需要记住在添加新方法时不要添加任何状态。我不认为它们在所有情况下都不好,而且随着流量的增加,它们肯定会最大限度地减少内存占用。
-
如果您的服务是基于云的微服务,您可能会发现在重负载需要时需要多个实例。您的云可能会启动多个实例来处理紧急情况,然后在结束后让它们停止服务。那么“单例”是什么意思呢?关键是无国籍。抱歉,如果这是“幸存者”的一集,辛格尔顿将被选为 GoF 岛。还有一点:singleton or no 对性能没有意义。决定这一点的是实施和所做的工作。
标签: c# singleton singleton-methods