When multiple threads try to initialize a Lazy`1 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`1 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 Lazy`1.Value property on that thread. The exception is not cached. The value of the Lazy`1.IsValueCreated property remains false, and subsequent calls to the Lazy`1.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 Lazy`1.Value property of the Lazy`1 instance, no exception is thrown.