0

我有一个关于无状态单身人士的问题。我还有一个关于状态单例的问题。

无状态单例服务是帮助可扩展性的好方法。构建我维护的项目的程序员基本上说不会有并发问题,因为“它只是代码”(即 Singleton 类)。这意味着该类没有类级别的变量。这只是方法。

这就是我对 C# 的了解变得有些模糊的地方。是否存在两个用户通过单独的 Web 请求同时点击无状态单例的问题?他们能否同时采用相同的方法?这甚至可能吗?如果是这样,这是否意味着他们将在该方法中使用相同的局部变量?听起来很混乱,所以我假设它不可能发生。我假设方法调用永远不会被其他用户污染。

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

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

谢谢

4

1 回答 1

2

单例是一种反模式。无状态的单例更糟糕。如果某些东西不保持状态,甚至没有最微弱的理由让它成为单例。

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

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

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

如果您阅读的频率高于写作频率,使用 aReaderWriterLock而不是 simplelock可能会有所帮助。见这里

于 2016-04-25T14:09:29.093 回答