From a56e30c8d33048216567753d9d3fefc2152af8ac Mon Sep 17 00:00:00 2001 From: Jiyoung Yun Date: Thu, 13 Apr 2017 14:17:19 +0900 Subject: Imported Upstream version 2.0.0.11353 --- .../System/Threading/LazyThreadSafetyMode.cs | 44 ++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/mscorlib/shared/System/Threading/LazyThreadSafetyMode.cs (limited to 'src/mscorlib/shared/System/Threading/LazyThreadSafetyMode.cs') diff --git a/src/mscorlib/shared/System/Threading/LazyThreadSafetyMode.cs b/src/mscorlib/shared/System/Threading/LazyThreadSafetyMode.cs new file mode 100644 index 0000000000..2d13f23762 --- /dev/null +++ b/src/mscorlib/shared/System/Threading/LazyThreadSafetyMode.cs @@ -0,0 +1,44 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// +// a set of lightweight static helpers for lazy initialization. +// +// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +namespace System.Threading +{ + /// + /// Specifies how a instance should synchronize access among multiple threads. + /// + public enum LazyThreadSafetyMode + { + /// + /// This mode makes no guarantees around the thread-safety of the instance. If used from multiple threads, the behavior of the is undefined. + /// This mode should be used when a is guaranteed to never be initialized from more than one thread simultaneously and high performance is crucial. + /// If valueFactory throws an exception when the is initialized, the exception will be cached and returned on subsequent accesses to Value. Also, if valueFactory recursively + /// accesses Value on this instance, a will be thrown. + /// + None, + + /// + /// When multiple threads attempt to simultaneously initialize a instance, this mode allows each thread to execute the + /// valueFactory but only the first thread to complete initialization will be allowed to set the final value of the . + /// Once initialized successfully, any future calls to Value will return the cached result. If valueFactory throws an exception on any thread, that exception will be + /// propagated out of Value. If any thread executes valueFactory without throwing an exception and, therefore, successfully sets the value, that value will be returned on + /// subsequent accesses to Value from any thread. If no thread succeeds in setting the value, IsValueCreated will remain false and subsequent accesses to Value will result in + /// the valueFactory delegate re-executing. Also, if valueFactory recursively accesses Value on this instance, an exception will NOT be thrown. + /// + PublicationOnly, + + /// + /// This mode uses locks to ensure that only a single thread can initialize a instance in a thread-safe manner. In general, + /// taken if this mode is used in conjunction with a valueFactory delegate that uses locks internally, a deadlock can occur if not + /// handled carefully. If valueFactory throws an exception when the is initialized, the exception will be cached and returned on + /// subsequent accesses to Value. Also, if valueFactory recursively accesses Value on this instance, a will be thrown. + /// + ExecutionAndPublication + } +} -- cgit v1.2.3