Как указал @BrokenGlass, это безопасно.Но я не смог устоять и должен был сделать тест ...
Печатается только один идентификатор потока ...
private static Lazy<int> lazyInt;
// make it slow
private int fib()
{
Thread.Sleep(1000);
return 0;
}
public void Test()
{
// when run prints the thread id
lazyInt = new Lazy<int>(
() =>
{
Debug.WriteLine("ID: {0} ", Thread.CurrentThread.ManagedThreadId);
return fib();
});
var t1 = new Thread(() => { var x = lazyInt.Value; });
var t2 = new Thread(() => { var x = lazyInt.Value; });
var t3 = new Thread(() => { var x = lazyInt.Value; });
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
}
Но какой из них быстрее?Из результатов я получил ...
Выполнение кода 100 раз
[ Lazy: 00:00:01.003 ]
[ Field: 00:00:01.000 ]
Выполнение кода 100000000 раз
[ Lazy: 00:00:10.516 ]
[ Field: 00:00:17.969 ]
Тестовый код:
Performance.Test("Lazy", TestAmount, false,
() =>
{
var laz = lazyInt.Value;
});
Performance.Test("Field", TestAmount, false,
() =>
{
var laz = FieldInt;
});
Метод испытания:
public static void Test(string name, decimal times, bool precompile, Action fn)
{
if (precompile)
{
fn();
}
GC.Collect();
Thread.Sleep(2000);
var sw = new Stopwatch();
sw.Start();
for (decimal i = 0; i < times; ++i)
{
fn();
}
sw.Stop();
Console.WriteLine("[{0,15}: {1,-15}]", name, new DateTime(sw.Elapsed.Ticks).ToString("HH:mm:ss.fff"));
}