성능 게으른 초기화 C # 게으른로드

C # 게으른로드

 

머리말

게으른 로딩 객체는 실제로 통화가의 지연 (지연로드) 장점은 시스템 성능을 개선하고 불필요한 계산 및 자원의 불필요한 낭비를 방지하는 것입니다 초기화 생성 될 때까지 연기 객체를 생성 요청시로드.

기존의 이러한 상황 :

  • 객체는 높은 비용을 생성 프로그램을 사용하지 않을 수 있습니다. 예를 들어, 고객 개체를 가진 메모리 특성 주문이 있습니다 가정, 객체가 주문 많은 수의 개체가 포함되어, 이러한 개체는 데이터베이스 연결을 초기화 할 필요가있다. 사용자가 표시하거나 주문 계산의 데이터를 사용하는 데 필요하지 않으면, 시스템 메모리 또는 컴퓨팅 사이클을 사용하여 만들 필요가 없습니다. 객체가 느린 초기화에 사용되는 주문을 선언하는 게으른을 사용하여, 객체는 시스템 자원의 낭비를 사용하지 않고 피할 수 있습니다.
  • 객체 생성 비용은, 당신은 다른 하나는 고가의 작업이 완료 만들 때까지 연기하고 싶다. 예를 들어, 가정 시작에 객체 인스턴스 프로그램 부하의 복수,하지만 즉시로드의 일부분이. 프로그램의 시작 성능을 향상시키기 위해 필요한 객체를 생성 할 때까지 연기 원치 않는 개체를 초기화하여. (공식 소스)

사용자 클래스를 만듭니다


 public class User
    {
        public string Name { get; set; } public int Age { get; set; } public User() { this.Name = "Name"; this.Age = 0; } } 

기본적으로 게으른 객체는 스레드 안전합니다. 생성자 보안 스레드의 유형을 지정하지 않는 경우 즉, 게으른이 기능은 스레드 안전을 생성 객체. 멀티 스레드 시나리오에서는 첫 번째 스레드가 개체의 Value 속성은 모든 스레드에 초기화 이후의 모든 액세스를 위해 스레드 안전 게으른 것 액세스하고, 모든 스레드는 같은 데이터를 공유 할 수 있습니다. 따라서, 객체를 초기화하는 스레드 중요하지 않습니다, 경쟁 조건은 양성이다.


    class Program
    {
        static void Main(string[] args) { Lazy<User> user = new Lazy<User>(); ThreadLocal<User> threadLocal = new ThreadLocal<User>(); if (!user.IsValueCreated) Console.WriteLine("The object is not initialized"); Console.WriteLine(user.Value.Name); user.Value.Name = "Name1"; user.Value.Age = 1; Console.WriteLine(user.Value.Name); Console.Read(); } } 
스레드 안전 객체 LazyThreadSafetyMode 모드 매개 변수 부울 매개 변수 isThreadSafe 어떤 스레드 안전 매개 변수 없습니다
스레드에 안전하고, 하나의 스레드가 값을 초기화하려고합니다. ExecutionAndPublication 진실 수 있습니다.
비 스레드 안전합니다. 없음 그릇된 해당 사항 없음.
완전 스레드 안전, 초기화 값에 대한 스레드 경합을. PublicationOnly 해당 사항 없음. 해당 사항 없음.

부울 타입이 어떤 IsValueCreated 속성입니다, 우리는 현재 개체가 초기화되지 않았습니다 확인하려면이 속성을 사용할 수 있습니다

전화, 만든 생성 후

, 내가 게으른 여러 생성자를 가정 해 봅시다

  • 게으른 공개 (BOOL isThreadSafe) :
    isThreadSafe 부울 매개 변수 값 속성이 여러 스레드에서 액세스 할 수 있는지 여부를 지정하는 데 사용됩니다 매개 변수입니다. 당신은 하나 개의 스레드에서 속성에 액세스하려면 들어오는 거짓은 겸손한 성능 이점을 얻을 수있다. 여러 스레드에서 속성에 액세스하려면 수신 사실을 올바르게 핸들 경쟁 조건 (하나 개의 스레드가 초기화시 예외를 throw)에 게으른 인스턴스를 나타냅니다.

  • 게으른 공개 (LazyThreadSafetyMode 모드는) : 스레드 안전 모드를 제공합니다.

  • 게으른 공개 (Func을 ValueFactory의) :
    람다 표현식은 생성자 새로운 게으른 개체에 전달됩니다. Value 속성은 그 후 새로운 값을 반환 새로운 게으른과 Value 속성의 초기화가 발생합니다 다음에 액세스가 속성에 할당되었습니다.

개요

참조 : https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

저자 : 펭 후이 @
출처 : https://www.cnblogs.com/yyfh/p/11996509.html

머리말

게으른 로딩 객체는 실제로 통화가의 지연 (지연로드) 장점은 시스템 성능을 개선하고 불필요한 계산 및 자원의 불필요한 낭비를 방지하는 것입니다 초기화 생성 될 때까지 연기 객체를 생성 요청시로드.

기존의 이러한 상황 :

  • 객체는 높은 비용을 생성 프로그램을 사용하지 않을 수 있습니다. 예를 들어, 고객 개체를 가진 메모리 특성 주문이 있습니다 가정, 객체가 주문 많은 수의 개체가 포함되어, 이러한 개체는 데이터베이스 연결을 초기화 할 필요가있다. 사용자가 표시하거나 주문 계산의 데이터를 사용하는 데 필요하지 않으면, 시스템 메모리 또는 컴퓨팅 사이클을 사용하여 만들 필요가 없습니다. 객체가 느린 초기화에 사용되는 주문을 선언하는 게으른을 사용하여, 객체는 시스템 자원의 낭비를 사용하지 않고 피할 수 있습니다.
  • 객체 생성 비용은, 당신은 다른 하나는 고가의 작업이 완료 만들 때까지 연기하고 싶다. 예를 들어, 가정 시작에 객체 인스턴스 프로그램 부하의 복수,하지만 즉시로드의 일부분이. 프로그램의 시작 성능을 향상시키기 위해 필요한 객체를 생성 할 때까지 연기 원치 않는 개체를 초기화하여. (공식 소스)

사용자 클래스를 만듭니다


 public class User
    {
        public string Name { get; set; } public int Age { get; set; } public User() { this.Name = "Name"; this.Age = 0; } } 

기본적으로 게으른 객체는 스레드 안전합니다. 생성자 보안 스레드의 유형을 지정하지 않는 경우 즉, 게으른이 기능은 스레드 안전을 생성 객체. 멀티 스레드 시나리오에서는 첫 번째 스레드가 개체의 Value 속성은 모든 스레드에 초기화 이후의 모든 액세스를 위해 스레드 안전 게으른 것 액세스하고, 모든 스레드는 같은 데이터를 공유 할 수 있습니다. 따라서, 객체를 초기화하는 스레드 중요하지 않습니다, 경쟁 조건은 양성이다.


    class Program
    {
        static void Main(string[] args) { Lazy<User> user = new Lazy<User>(); ThreadLocal<User> threadLocal = new ThreadLocal<User>(); if (!user.IsValueCreated) Console.WriteLine("The object is not initialized"); Console.WriteLine(user.Value.Name); user.Value.Name = "Name1"; user.Value.Age = 1; Console.WriteLine(user.Value.Name); Console.Read(); } } 
스레드 안전 객체 LazyThreadSafetyMode 모드 매개 변수 부울 매개 변수 isThreadSafe 어떤 스레드 안전 매개 변수 없습니다
스레드에 안전하고, 하나의 스레드가 값을 초기화하려고합니다. ExecutionAndPublication 진실 수 있습니다.
비 스레드 안전합니다. 없음 그릇된 해당 사항 없음.
완전 스레드 안전, 초기화 값에 대한 스레드 경합을. PublicationOnly 해당 사항 없음. 해당 사항 없음.

부울 타입이 어떤 IsValueCreated 속성입니다, 우리는 현재 개체가 초기화되지 않았습니다 확인하려면이 속성을 사용할 수 있습니다

전화, 만든 생성 후

, 내가 게으른 여러 생성자를 가정 해 봅시다

  • public Lazy (bool isThreadSafe)
    isThreadSafe 的布尔参数,该方法参数用于指定是否从多线程访问 Value 属性。 如果想要仅从一个线程访问属性,则传入 false 以获取适度的性能优势。 如果想要从多线程访问属性,则传入 true 以指示 Lazy 实例正确处理争用条件(初始化时一个线程引发异常)。

  • public Lazy (LazyThreadSafetyMode mode):提供线程安全模式。

  • public Lazy (Func valueFactory)
    lambda 表达式传递给新的 Lazy 对象的构造函数。 下一次访问 Value 属性将导致新 Lazy 的初始化,并且其 Value 属性此后会返回已分配给该属性的新值。

总结

参考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

作者:@冯辉
出处:https://www.cnblogs.com/yyfh/p/11996509.html

추천

출처www.cnblogs.com/Leo_wl/p/12315368.html