我在多线程环境中遇到了我的单例类问题。此示例程序在单独的线程上调用方法 A 和 B。通常这可以正常工作。
在某些情况下,如底部的最后一个结果所示
这是因为我没有执行双锁吗?我如何确保这不会发生?
呼叫者
class Program
{
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CallonThread));
Singleton.Instance.Test("B");
Console.ReadKey();
}
static void CallonThread(object a)
{
Singleton.Instance.Test("A");
}
}
单例类
public class Singleton
{
static readonly object Padlock = new object();
private static Singleton _instance;
protected Singleton()
{
}
public static Singleton Instance
{
get
{
lock (Padlock)
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
}
public void Test(string id)
{
if (id == "A")
{
new Data().MethodA();
}
else
{
new Data().MethodB();
}
}
}
数据类
public class Data
{
public void MethodA()
{
Console.WriteLine("Start Method A");
Console.WriteLine("End Method A");
}
public void MethodB()
{
Console.WriteLine("Start Method B");
Console.WriteLine("End Method B");
}
}
这将有助于阻止 MethodA 和 MethodB 同时执行:
public class Data
{
private static object _padlock = new object();
public void MethodA()
{
lock (_padlock)
{
Console.WriteLine("Start Method A");
Console.WriteLine("End Method A");
}
}
public void MethodB()
{
lock (_padlock)
{
Console.WriteLine("Start Method B");
Console.WriteLine("End Method B");
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句