有三个不同的线程:A、B、C和一个实例化对象的方法:void InitObject();
这三个线程是同时执行的,顺序分别为C、A、B
每个线程执行的时候都要调用InitObject(),即每个线程都会实例化同一个对象,而且实例化的结果都是一样的
但我只想实例化一次,并且这三个线程必须都执行
请问有什么方法可以实现?有没有可能把这三个线程合并成一个,让合并后的线程去调用InitObject()?
这三个线程是同时执行的,顺序分别为C、A、B
每个线程执行的时候都要调用InitObject(),即每个线程都会实例化同一个对象,而且实例化的结果都是一样的
但我只想实例化一次,并且这三个线程必须都执行
请问有什么方法可以实现?有没有可能把这三个线程合并成一个,让合并后的线程去调用InitObject()?
2、用单例模式吧,但三个线程如果都要修改对象的话,要加锁,即:先lock(对象)再访问
using System;namespace SigletonPattern.Sigleton
{
/**//// <summary>
/// 功能:在C#用双重锁定实现单件模式
/// 编写:Terrylee
/// 日期:2005年12月06日
/// </summary>
public class DoubLockSigleton
{//volatile 表示编译器不能自动优化调试语句.(避免调整语句位置和顺序导致初始化时间点不正确.sky)
private static volatile DoubLockSigleton instance;/**//// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();/**//// <summary>
/// 构造方法改为Private
/// </summary>
private DoubLockSigleton()
{}public static DoubLockSigleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new DoubLockSigleton();
}
}return instance;
}
}}
}
{
private static volatile SingletonClass sc;
private static object syncLock = new object();
Public static SingletonClass GetSc()
{
if (sc == null)
{
lock (syncLock)
{
if (sc == null)
{
sc = new SingletonClass();
}
}
}
return sc;
}
}
public sealed class Singleton
{
Singleton()
{
} public static Singleton Instance
{
get
{
return Nested.instance;
}
} class Nested
{
internal static readonly Singleton instance; static Nested()
{
instance = new Singleton();
}
} private int num = 0; /**//// <summary>
/// 增加
/// </summary>
public void Add()
{
num++;
Console.WriteLine("输出:" + num);
} } //-------------------------------------------------------------- class Program
{
public static void Print()
{
Singleton singleton = Singleton.Instance;
lock (singleton)
{
for (int i = 0; i < 5; i++)
{
singleton.Add();
}
}
} static void Main(string[] args)
{
Thread threadFst = new Thread(new ThreadStart(Print));
threadFst.Name = "Fst";
Thread threadScd = new Thread(new ThreadStart(Print));
threadScd.Name = "Scd";
threadFst.Start();
threadScd.Start();
Console.ReadLine();
}
}
这段代码执行过后,输出的是1、2、3、4、5、6、7、8、9、10
单件模式不是在第一次使用这个对象的时候才对这个对象进行初始化吗?可为什么两个线程都执行了输出操作?
不太明白,请教各位