无状态单例和并发

Stateless Singletons and Concurrency

我有一个关于无状态单例的问题。我也有一个关于单例状态的问题。

无状态单例服务是帮助提高可伸缩性的好方法。设计我维护的项目的程序员基本上说不会有并发问题,因为 "it is just code"(Singleton class,即)。这意味着 class 没有 class 级别变量。这只是方法。

这是我对 C# 的了解有点模糊的地方。 2 个用户通过单独的 Web 请求同时访问无状态单例是否存在任何可能的问题?他们能否同时以相同的方法结束?这可能吗?如果是这样,是否意味着他们会在该方法中使用相同的局部变量?听起来像一团糟,所以我认为这不可能发生。我假设方法调用永远不会被其他用户污染。

这个问题我问过很多同事,没人知道答案。所以这是一个棘手的问题。

我关于单例的问题通常是 2 个或更多并发用户读取单例的 public 属性 是否有任何问题。我只对阅读感兴趣。如果 属性 不在锁块内,是否有可能出现某种并发异常?还是并发、同步读取安全?我真的不想使用 lock 关键字,因为这是我不需要的性能损失。

谢谢

单例是 anti-pattern。无状态的单身人士更糟。如果某物不保持状态,则甚至没有最微弱的理由使其成为单例。

无状态单例是一个纯静态函数,来自喜欢添加模式而不考虑模式会实现什么的人。因为在这种情况下,他会注意到它一无所获。

如果您看到一个无状态单例,您可以安全地删除使其成为单例的所有代码。在 class 定义中添加 static。完毕。比以前好多了。

我认为您对多线程、单例与否感到很困惑。我建议您阅读一本关于此的好书或教程,因为它超出了此处简单答案的范围。如果你有共享资源(简单的例子,一个不是本地的变量)那么你需要在多线程环境中特别小心。

如果您阅读的次数多于写作的次数,使用 ReaderWriterLock 而不是简单的 lock 可能会有所帮助。参见 here