在多线程系统中使用静态对象

Posted

技术标签:

【中文标题】在多线程系统中使用静态对象【英文标题】:Using static objects in a multi-threaded system 【发布时间】:2020-05-29 02:05:35 【问题描述】:

我想知道多线程系统以下列方式使用静态类意味着什么:

    不使用服务: A 类的多个实例使用相同的静态 B 类进行一些随机计算(例如 System.Math) 使用 WCF 服务: 一种。让 1 个 WCF 服务执行 1 中所述的操作。 湾。拥有多个 WCF 服务,每个服务都有 1 个 A 类实例,使用相同的静态 B 类进行一些随机计算 C。拥有多个 WCF 服务,每个服务都有多个 A 类实例,都使用相同的静态 B 类进行一些随机计算

据我了解,按照 2.b 使用静态类。是多线程系统的唯一正确选择,因为每个 WCF 服务都将创建自己的静态类副本/实例。所有其他选项将共享相同的静态类,因此不允许多线程。

这样说对吗?

这对其他选项意味着什么?有没有办法让静态类以某种方式可实例化?考虑到 System.Math,我真的不能只去编辑源代码。 或者通过在使用这些静态类的地方添加一个锁来解决它是一种常见的做法?

如果可能的话,也许应该使用单音而不是静态?

【问题讨论】:

多线程同时使用System.Math有什么问题?此类不存储内部可变共享状态。 @ Theodor Zoulias - 那么,多线程系统是否应该实际上不是多线程而不是排队?在我列出的大多数情况下不会发生并发。 【参考方案1】:

我认为最好的选择是在使用静态类的地方添加一个锁

【讨论】:

什么原因? 那是有代价的!​​span>

以上是关于在多线程系统中使用静态对象的主要内容,如果未能解决你的问题,请参考以下文章

在多线程中使用静态方法是否有线程安全问题

在多线程中使用静态方法是否有线程安全问题

OKHTTP Singleton 对象在多线程系统中处理不同的 API 调用

C++11:在多线程程序中使用局部静态变量导致 coredump

C# 在多线程环境中,进行安全遍历操作

java 局部静态变量在多线程环境下是不是有线程安全问题??