Safety Mode. Publication Only
When multiple threads try to initialize a Lazy<T> instance simultaneously, all threads are allowed to run the initialization method (or the default constructor, if there is no initialization method). The first thread to complete initialization sets the value of the Lazy<T> instance. That value is returned to any other threads that were simultaneously running the initialization method, unless the initialization method throws exceptions on those threads. Any instances of
T that were created by the competing threads are discarded. If the initialization method throws an exception on any thread, the exception is propagated out of the Value property on that thread. The exception is not cached. The value of the IsValueCreated property remains
false, and subsequent calls to the Value property, either by the thread where the exception was thrown or by other threads, cause the initialization method to run again. If the initialization method recursively accesses the Value property of the Lazy<T> instance, no exception is thrown.