gpt4 book ai didi

C# 单例线程安全

转载 作者:可可西里 更新时间:2023-11-01 08:56:46 24 4
gpt4 key购买 nike

我有一个类似这样的单例类

public class Singleton
{
private static Singleton m_instance;
private Timer m_timer;
private static List<CustomObject> m_cacheObjects;

private Singleton()
{
m_cacheObjects = new List<CustomObject>();
m_timer= new Timer(MyTimerCallBack,
null,
TimeSpan.FromSeconds(60),
TimeSpan.FromSeconds(60));
}

public static Singleton Instance
{
get
{
if (m_instance == null)
{
m_instance = new Singleton();
}
return m_instance;
}
}

private void MyTimerCallBack(object state)
{
//******** Update the list by interval here ******************

m_cacheObjects = UpdateTheList();
}

public void CallMe()
{
foreach (CustomObject obj in m_cacheObjects)
{
// do something here based on obj

// The question is, does the m_cacheObjects is thread safe??
// what happen if the m_cacheObjects is changed
// during the loop interation?
}
}
}

CallMe 方法将由网络服务调用:

  [WebMethod]
public void CallMeWebService()
{
Singleton.Instance.CallMe();
}

问题:1) m_cacheObjects 是线程安全的吗?如果在循环交互期间(在 CallMe() 中)更改了 m_cacheObjects(由于计时器),会发生什么情况?

2) 调用Webservice CallMeWebService()时是否会创建一个新线程?

最佳答案

1:不,静态列表不是自动线程安全的;您必须手动保护 m_cacheObjects

2:这是一个实现细节;乍一看,它似乎将自己公开为一个同步方法,但如何完全取决于它

实际上,您的静态初始化也不是线程安全的;我可以暴力破解使用两个不同 Singleton 实例的场景。产生它需要重复,但它会发生。

坦率地说,除非你有充分的理由不这样做,否则最简单但最安全的单例模式就是:

private static readonly Singleton m_instance = new Singleton();

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

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