Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无状态单例与并发_C#_Singleton_Singleton Methods - Fatal编程技术网

C# 无状态单例与并发

C# 无状态单例与并发,c#,singleton,singleton-methods,C#,Singleton,Singleton Methods,我有一个关于无国籍单身人士的问题。我还有一个关于州政府单身人士的问题 无状态单例服务是帮助提高可伸缩性的好方法。设计我维护的项目的程序员基本上说不会有并发问题,因为“它只是代码”(即Singleton类)。这意味着该类没有类级别的变量。这只是方法 这就是我对C#的了解有点模糊的地方。如果两个用户通过单独的web请求同时命中无状态单例,是否存在任何可能的问题?他们会在同一时间以同样的方式结束吗?这可能吗?如果是这样的话,这是否意味着他们将在该方法中使用相同的局部变量?听起来像是一团糟,所以我认为这

我有一个关于无国籍单身人士的问题。我还有一个关于州政府单身人士的问题

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

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

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

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

谢谢

Singleton是一个好朋友。无国籍的单身汉更糟糕。如果某个东西不具备状态,那么就没有哪怕是最微弱的理由让它成为单身

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

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

我认为您对多线程相当困惑,不管是单线程还是非单线程。我建议你读一本关于这方面的好书或教程,因为这里的简单答案已经超出了范围。如果您有共享资源(简单的示例,一个非本地变量),那么在多线程环境中需要特别小心

如果您的阅读频率高于写作频率,那么使用
ReaderWriterLock
而不是简单的
lock
可能是有益的。请参阅。

Singleton是一个。无国籍的单身汉更糟糕。如果某个东西不具备状态,那么就没有哪怕是最微弱的理由让它成为单身

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

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

我认为您对多线程相当困惑,不管是单线程还是非单线程。我建议你读一本关于这方面的好书或教程,因为这里的简单答案已经超出了范围。如果您有共享资源(简单的示例,一个非本地变量),那么在多线程环境中需要特别小心


如果您的阅读频率高于写作频率,那么使用
ReaderWriterLock
而不是简单的
lock
可能是有益的。请参阅。

无状态有利于并发;除了创建全局变量外,单例对任何事情都没有好处。谷歌从他们的代码库中删除单例。你为什么坚持传播它们?如果同时对同一个方法进行两次调用,每个调用都会有自己的堆栈和自己的局部变量集。你只需要担心与共享变量的并发性。你说“web请求”,这是asp.net吗?是线程安全的(剩下的问题我就不明白了)。@duffymo我已经在一年的时间里使用了具有单例生存期的服务。它似乎工作得很好,不难相处。您只需要记住在添加新方法时不要添加任何状态。我不认为它们在所有情况下都是不好的,而且随着流量的增加,它们肯定会将内存占用降至最低。如果您的服务是基于云的微服务,您可能会发现在高负载需要时需要多个实例。您的云可能会启动多个实例来应对这一紧急情况,然后在结束后让它们停止服务。那么“单身”是什么意思呢?关键是无状态。对不起,如果这是《幸存者》的一集,辛格尔顿将被淘汰出GoF岛。还有一点:单例或否对性能没有意义。实现和所做的事情决定了这一点;除了创建全局变量外,单例对任何事情都没有好处。谷歌从他们的代码库中删除单例。你为什么坚持传播它们?如果同时对同一个方法进行两次调用,每个调用都会有自己的堆栈和自己的局部变量集。你只需要担心与共享变量的并发性。你说“web请求”,这是asp.net吗?是线程安全的(剩下的问题我就不明白了)。@duffymo我已经在一年的时间里使用了具有单例生存期的服务。它似乎工作得很好,不难相处。您只需要记住在添加新方法时不要添加任何状态。我不认为它们在所有情况下都是不好的,而且随着流量的增加,它们肯定会将内存占用降至最低。如果您的服务是基于云的微服务,您可能会发现在高负载需要时需要多个实例。您的云可能会启动多个实例来应对这一紧急情况,然后一旦启动,就让它们停止服务