gpt4 book ai didi

c# - Structuremap 单例线程安全吗?

转载 作者:行者123 更新时间:2023-11-30 16:34:19 25 4
gpt4 key购买 nike

目前我有以下类(class):

    public class PluginManager
{
private static bool s_initialized;
private static object s_lock = new object();

public static void Initialize() {
if (!s_initialized) {
lock (s_lock) {
if (!s_initialized) {
// initialize

s_initialized = true;
}
}
}
}
}

这里重要的是 Initialize() 应该只在应用程序运行时执行一次。我认为我会将其重构为一个单例类,因为这会更加线程安全?:

    public sealed class PluginService
{
static PluginService() { }
private static PluginService _instance = new PluginService();
public static PluginService Instance { get { return _instance; } }

private bool s_initialized;

public void Initialize() {
if (!s_initialized)
{
// initialize

s_initialized = true;
}
}
}

问题一,是否仍然需要在此处锁定(我已将其删除),因为我们只会在同一个实例上工作?

最后,我想使用 DI 和结构图来初始化我的服务,所以我重构如下:

    public interface IPluginService {
void Initialize();
}

public class NewPluginService : IPluginService
{
private bool s_initialized;
public void Initialize() {
if (!s_initialized) {
// initialize

s_initialized = true;
}
}
}

在我的注册表中:

            ForRequestedType<IPluginService>()
.TheDefaultIsConcreteType<NewPluginService>().AsSingletons();

这按预期工作(单例在以下代码中返回 true):

            var instance1 = ObjectFactory.GetInstance<IPluginService>();           
var instance2 = ObjectFactory.GetInstance<IPluginService>();

bool singleton = (instance1 == instance2);

所以我的下一个问题是结构映射解决方案与单例类一样线程安全(第二个示例)。唯一的缺点是这仍然允许直接实例化 NewPluginService(如果不使用结构图)。

非常感谢,本

最佳答案

我会提出几个建议:

  • bool 标志应该是volatile
  • 让你的单例实例readonly
  • 初始化不是线程安全的,不管你只有一个实例......所以它应该是同步的

    public sealded class PluginService
    {

    static PluginService() { }

    //make the instance readonly
    private static readonly PluginService _instance = new PluginService();
    public static PluginService Instance { get { return _instance; } }

    // make the flag volatile
    private static volatile bool s_initialized = false;
    private static object s_lock = new object();


    // you still need to synchronize when you're initializing
    public void Initialize() {
    lock(s_lock)
    {
    if (!s_initialized)
    {
    // initialize

    s_initialized = true;
    }
    }
    }
    }

结构图上没有争用,所以它的线程安全似乎没有受到损害......

您的单例类不是线程安全的。要记住的主要事情是,单个实例并不能确保单个线程只能访问它。如果有多个线程引用了该实例,那么就会对该实例及其持有的数据产生争用。如果存在争用,则应确保线程安全(至少同步)。

关于c# - Structuremap 单例线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2522491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com