lazy对象由一个线程创建,其它线程可共用
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class Program
{
static Lazy<LargeObject> lazyLargeObject = null;
internal class LargeObject
{
int initBy = 0;
public int InitializedBy => initBy;
public LargeObject()
{
initBy = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("LargeObject created by thread id {0}", initBy);
}
public long[] Data = new long[100000];
}
static void Main(string[] args)
{
lazyLargeObject = new Lazy<LargeObject>();
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
Thread[] threads = new Thread[] { new Thread(ThreadProc), new Thread(ThreadProc) };
foreach (var t in threads)
{
t.Start(manualResetEvent);
}
manualResetEvent.Set(); //设置事件信号状态,允许一个或多个线程开始处理
foreach (Thread t in threads)
{
t.Join();
}
SayHello("Helo");
Console.WriteLine("Hello World!");
Console.Read();
}
static void ThreadProc(object state)
{
ManualResetEvent waitFor = (ManualResetEvent)state;
waitFor.WaitOne();
LargeObject largeObject = lazyLargeObject.Value;
Thread.Sleep(5);
lock (largeObject)
{
largeObject.Data[0] = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("{0}---{1}", largeObject.InitializedBy, largeObject.Data[0]);
}
}
static void SayHello(string str)
{
// Debug.Assert(str == "Hello", "NOt hello");
Console.WriteLine("Hello World!");
Console.Read();
}
}
}