对于我正在研究的项目,我正在实现一个类作为奇点。该类负责检测系统正在运行的阶段(开发,测试,生产等),并相应地返回某些值,以便我们的开发团队不必担心每次使用这些值时都要处理分段设置。此外,它允许我们覆盖当前阶段的目的,以便假装处于不同的阶段。
我担心的是,当涉及多线程时,奇点将如何表现。下面的代码概述了将要使用的基本设置。
我的问题是,如果节目& program2可能同时在不同的线程上运行,OverrideStage()函数(它改变实例中的私有变量)是否会干扰其他程序的预期行为?
示例:
1)程序启动,将阶段设置为DEV
2)在另一个主题上,Program2启动,将阶段设置为PRODUCTION
3)返回程序,尝试获取值,该值是否在DEV或PRODUCTION中?
namespace TESTING
{
class Program
{
static void Run()
{
Staging stage = Staging.Instance;
stage.OverrideStage(Staging.DEV);
SqlConnection connDev = new SqlConnection(stage.ConnectionString("example")); // Connection to development database
// Do Stuff
stage.EndOverride();
SqlConnection connBackToAuto = new SqlConnection(stage.ConnectionString("example")); // Connection to detected stage database
}
}
class Program2
{
static void Run()
{
Staging s = Staging.Instance;
s.OverrideStage(Staging.PRODUCTION);
SqlConnection connDev = new SqlConnection(s.ConnectionString("example")); // Connection to production database
// Do stuff
s.EndOverride();
}
}
} // End namespace
我想这个问题可以简化为:
s和舞台是同一个舞台实例吗?
答案 0 :(得分:1)
我不相信你的申请可以有两个主要的切入点...你所描述的是不可行的,除非你指定多个入口点。
现在,如果可行(即你指定了多个入口点),那么
您尝试更改Staging
模式将导致更新两个程序实例的模式。
让我们看看你的例子:
1) Program starts, sets stage to DEV
2) On another thread, Program2 starts, sets stage to PRODUCTION
3) Back in Program, try to get a value, will the value be in DEV or PRODUCTION?
该值很可能是PRODUCTION
,但根据线程的启动方式可能并非如此。它可能会变得复杂,因为如果两个线程一个接一个地相对快速地启动,那么该阶段可能是DEV
或PRODUCTION
,具体取决于两个线程之间发生上下文切换的时间。
由于您已使用Main
方法替换Run
方法,因此删除了多个入口点。
单身或不单身
您所描述的情况非常混乱,主要是因为程序通常包含应用程序的Main
入口点。在正常情况下,人们会期望该程序以DEV
或PRODUCTION
模式运行。在不同的线程和不同的模式下运行多个程序实例是非常令人困惑的! 我想不出任何人想要这样做的现实例子。
让我们假设有一个不起眼的例子:最好的办法是为每个程序提供自己的内部暂存状态,而不是全局(Singleton)暂存状态。这可以保证您可以在多个线程中启动程序的多个实例,并且每个实例都可以彼此独立地运行。您通常希望尽可能少地在线程之间共享 - 有些人将其称为shared nothing architecture。
什么是暂存模式?
如果采用Singleton方法,那么这个问题就很难回答。
Program2
的线程等待Program
初始化(通过某种thread signalling mechanism),那么你可以保证模式将会是PRODUCTION
。DEV
或PRODUCTION
,具体取决于许多问题。实际上,您可以在不同的命名空间中创建单独的Staging
类,并根据您使用的模式使用每个类。但是,这与维护两个单独的Staging类(即DevStaging
和ProductionStaging
没有什么不同。你通常希望避免两次编码相同的东西,所以这个选项开始看起来越来越不可取。
一般而言,了解您当前使用哪种暂存模式实际上与线程无关,这个问题在涉及线程时会被放大。您的Staging
模式将更改的原因是因为两个程序都使用相同的暂存实例,该实例由Staging(单例)实例提供给它们。