Skip to content

Lazy<T>

This section will look closer into the Lazy<T> type.

Use the correct LazyThreadSafetyMode option

If you are using Lazy only in a single-threaded manner, you can save some resources when providing either the isThreadSafe parameter or pass in the correct LazyThreadSafetyMode. The default is LazyThreadSafetyMode.ExecutionAndPublication which creates locks to ensure the synchronization.

Bad Use the multi-thread safe version in a single-threaded application.

var instance = new Lazy<MyClass>(() => new MyClass());

Good Pass the isThreadSafe parameter.

var instance = new Lazy<MyClass>(() => new MyClass(), isThreadSafe: false);

Good Pass the correct LazyThreadSafetyMode parameter.

var instance = new Lazy<MyClass>(() => new MyClass(), LazyThreadSafetyMode.None);

Benchmark

public class LazyBenchmark
{
    [Params(
        LazyThreadSafetyMode.None,
        LazyThreadSafetyMode.PublicationOnly,
        LazyThreadSafetyMode.ExecutionAndPublication)]
    public LazyThreadSafetyMode Option { get; set; }

    [Benchmark]
    public int Lazy()
    {
        var lazy = new Lazy<MyClass>(() => new MyClass(), Option);
        return lazy.Value.MyFunc();
    }
}

public class MyClass
{
    public int MyFunc() => 2;
}

Results:

| Method |               Option |     Mean |    Error |   StdDev |
|------- |--------------------- |---------:|---------:|---------:|
|   Lazy |                 None | 28.06 ns | 0.641 ns | 1.797 ns |
|   Lazy |      PublicationOnly | 32.25 ns | 0.676 ns | 1.013 ns |
|   Lazy | Execu(...)ation [23] | 41.82 ns | 0.829 ns | 1.655 ns |