静态对象在多个正在运行的应用程序中是同一个对象吗?

Posted

技术标签:

【中文标题】静态对象在多个正在运行的应用程序中是同一个对象吗?【英文标题】:Is a static object the same object in multiple running applications? 【发布时间】:2012-04-04 17:12:37 【问题描述】:

如果您有一个 Windows 服务和一个 Windows 窗体应用程序使用相同的静态对象,那么这两个应用程序中的对象是否相同?换句话说,如果我在服务中更新对象,如果两者同时运行,它是否也会在表单应用程序中更新?

【问题讨论】:

【参考方案1】:

它们在不同的进程上运行,因此它们不共享静态对象。

与您的问题无关,但在同一应用程序上创建的线程是另一回事。除非标有ThreadStatic 属性,否则它们将共享静态变量

【讨论】:

【参考方案2】:

没有。除非你做一些特定的事情来实现这个对象在不同的​​进程之间是不共享的。

【讨论】:

【参考方案3】:

对此的简单回答是每个进程都有自己的静态,所以不,它不会在服务和桌面进程之间共享。

复杂的部分是在一个单个进程中甚至可能有多个静态实例。

Java 中,每个加载类的ClassLoader 都有一个静态对象实例。我在C# 中检查了等效功能。我发现this question on SO 表明在C# 中确实存在类似于多个类加载器的东西(我猜实际上是在CLR 中),尽管我没有找到对静态多个实例的任何具体引用,但我确信这会就是这样。

【讨论】:

【参考方案4】:

简单地说,不, static 是 'static per AppDomain' (每个进程可以有多个域),因此即使一个进程也不能安全地假设您的静态变量将是“共享的”(通常是真的,除非您手动创建新域,例如见What is AppDomain?) - 例如Web 应用程序通常会破坏“静态”单例等。 换句话说,您需要使用某种持久性才能在不同的应用程序之间共享您的数据。或者使用远程处理、WCF 通过应用程序(域)边界进行通信。

【讨论】:

【参考方案5】:

我认为每个应用程序都在自己的进程中运行。我真的怀疑在 Windows 服务中更新静态对象对作为 Windows 窗体应用程序运行的静态对象有任何影响。

Windows 服务在system 帐户下运行,而Windows 窗体应用程序在User 帐户下运行。

正如其他人在 cmets 中指出的那样,进程在不同的内存中运行。每个过程都有 它自己的地址空间。

Windows 服务响应服务控制管理器命令。

它们是完全不同的两种东西。

【讨论】:

这与用户帐户无关。不同的进程有单独的内存空间,因此默认情况下不共享数据。 @BrianRasmussen 绝对 - Sandeep 你应该编辑一下。

以上是关于静态对象在多个正在运行的应用程序中是同一个对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥main方法在java中是静态的[重复]

静态、全局和多个翻译单元

在 PHP 中使用静态方法和属性会占用更少的内存吗?

静态对象成员会在所属类的析构函数被调用时自动析构吗?

将变量放在 AppDelegate 中是 Swift 中静态变量的解决方法吗?

静态对象/多个应用程序域/一个进程