다음을 통해 공유


LazyThreadSafetyMode 열거형

정의

Lazy<T> 인스턴스가 여러 스레드 간 액세스를 동기화하는 방법을 지정합니다.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
상속
LazyThreadSafetyMode

필드

ExecutionAndPublication 2

잠금을 사용하여 단일 스레드만 스레드로부터 안전한 방식으로 Lazy<T> 인스턴스를 초기화할 수 있도록 합니다. 실제로 초기화 메서드는 스레드로부터 안전한 방식으로 실행됩니다(필드 이름이라고 함 Execution ). Publication 초기화된 값의 값은 모든 스레드에서 하나의 값만 게시하고 사용할 수 있다는 점에서 스레드로부터 안전합니다. 초기화 메서드(또는 초기화 메서드를 찾을 수 없습니다. 매개 변수가 없는 생성자)에서 내부적으로 잠금을 사용하는 경우 교착 상태가 발생할 수 있습니다. 초기화 메서드(valueFactory 매개 변수)를 지정하는 Lazy<T> 생성자를 사용하며 Value 속성을 처음 호출할 때 해당 초기화 메서드에서 예외가 발생하거나 예외를 처리하지 못하는 경우 예외가 캐시되고 Value 속성의 후속 호출에서 다시 예외가 발생합니다. 초기화 메소드를 지정하지 않는 Lazy<T> 생성자를 사용하는 경우 T의 매개 변수가 없는 생성자가 throw하는 예외는 캐싱되지 않습니다. 이 경우 Value 속성의 후속 호출에서 Lazy<T> 인스턴스를 초기화할 수도 있습니다. 초기화 메서드에서 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하는 경우 InvalidOperationException이 발생합니다.

None 0

Lazy<T> 인스턴스는 스레드로부터 안전하지 않습니다. 여러 스레드에서 인스턴스에 액세스하는 경우 해당 동작이 정의되어 있지 않습니다. 고성능이 중요하며 Lazy<T> 인스턴스가 둘 이상의 스레드에서 초기화되지 않는 경우에만 이 모드를 사용합니다. 초기화 메서드(valueFactory 매개 변수)를 지정하는 Lazy<T> 생성자를 사용하며 Value 속성을 처음 호출할 때 해당 초기화 메서드에서 예외가 발생하거나 예외를 처리하지 못하는 경우 예외가 캐시되고 Value 속성의 후속 호출에서 다시 예외가 발생합니다. 초기화 메소드를 지정하지 않는 Lazy<T> 생성자를 사용하는 경우 T의 매개 변수가 없는 생성자가 throw하는 예외는 캐싱되지 않습니다. 이 경우 Value 속성의 후속 호출에서 Lazy<T> 인스턴스를 초기화할 수도 있습니다. 초기화 메서드에서 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하는 경우 InvalidOperationException이 발생합니다.

PublicationOnly 1

여러 스레드에서 Lazy<T> 인스턴스를 동시에 초기화하려고 하면 모든 스레드에서 초기화 메서드(또는 초기화 메서드를 찾을 수 없습니다. 매개 변수가 없는 생성자)를 실행할 수 있습니다. 초기화를 완료하는 첫 번째 스레드에서 Lazy<T> 인스턴스의 값을 설정합니다. 이를 필드 이름에서라고 Publication 합니다. 초기화 메서드에서 해당 스레드에 대한 예외가 발생하지 않는 경우 초기화 메서드를 동시에 실행하는 다른 모든 스레드에 해당 값이 반환됩니다. 경쟁하는 스레드에서 만든 모든 T 인스턴스가 삭제됩니다. 실제로 초기화된 값의 게시는 초기화된 값 중 하나만 게시되고 모든 스레드에서 사용될 수 있다는 점에서 스레드로부터 안전합니다. 초기화 메서드에서 스레드에 대한 예외가 발생하는 경우 해당 스레드의 Value 속성에서 예외가 전파됩니다. 예외가 캐시되지 않습니다. IsValueCreated 속성의 값은 false로 유지되며, 예외가 발생한 스레드나 다른 스레드에 의한 Value 속성의 후속 호출에서 초기화 메서드를 다시 실행합니다. 초기화 메서드에서 Lazy<T> 인스턴스의 Value 속성에 재귀적으로 액세스하는 경우 예외가 발생하지 않습니다.

설명

이 열거형을 사용 하 여 지정 된 mode 의 매개 변수 Lazy<T> 생성자입니다. 가지고 여부 또는이 열거형 측면에서 스레드 동기화에 대 한 모든 생성자의 효과 설명할 수 있습니다 mode 매개 변수입니다.

Lazy<T> 인스턴스는 사용자 지정 초기화 메서드 또는 매개 변수가 없는 생성자에 T의해 초기화됩니다. 지정 된 초기화 메서드가 합니다 valueFactory 의 매개 변수를 Lazy<T> 생성자입니다. 인스턴스를 반환 하는 메서드 T, 인스턴스에서 지연 초기화 되는 형식인 Lazy<T>합니다. 생성자에 매개 변수가 valueFactory 없는 경우 매개 변수가 없는 생성자를 T 사용하여 인스턴스를 초기화합니다 Lazy<T> . 두 경우 모두 초기화가 처음 호출 하면 발생 합니다 Lazy<T>.Value 속성입니다.

스레드 보안을 지정 하는 것 외에도 Lazy<T> 예외 캐싱을 하는 경우가이 열거형에 영향을 줍니다. 에 대 한 예외가 캐시 되 면을 Lazy<T> 인스턴스를 표시 한 번만 인스턴스를 초기화 합니다. 처음으로 예외가 발생 하는 경우 호출 하는 Lazy<T>.Value 예외가 캐시 되 고 모든 후속 호출에서 다시 throw 속성인은 Lazy<T>.Value 속성입니다. 예외 캐싱을의 장점은 모든 두 스레드가 오류가 발생 하는 경우에 항상 동일한 결과 얻을 한다는 점입니다.

PublicationOnly 모드를 지정 하는 경우 예외가 캐시 되지 됩니다. None 또는 ExecutionAndPublication을 지정하는 경우 캐싱은 초기화 메서드를 지정할지 아니면 매개 변수가 없는 생성자를 T 사용할 수 있는지 여부에 따라 달라집니다. 초기화 메서드를 지정하면 이 두 모드에 대해 예외 캐싱을 사용합니다. 초기화 메서드는 매우 간단할 수 있습니다. 예를 들어 C#New Lazy(Of Contents)(Function() New Contents())이나 Visual Basic 매개 변수가 없는 생성자를 T``new Lazy<Contents>(() => new Contents(), mode) 호출할 수 있습니다. 초기화 메서드를 지정하지 않는 생성자를 사용하는 경우 매개 변수가 없는 생성자에 T 의해 throw되는 예외는 캐시되지 않습니다. 다음 표에서 예외 캐싱 동작을 보여 줍니다.

모드 초기화 메서드를 사용 하 여 에 대한 매개 변수 없는 생성자 사용 T
None 캐시됨 캐시되지 않음
PublicationOnly 캐시되지 않음 캐시되지 않음
ExecutionAndPublication 캐시됨 캐시되지 않음

적용 대상

추가 정보