SQL LIFE

Thread Safe Singleton Design Pattern Kullanımı

Thread Safe Singleton Design Pattern Kullanımı


How to implement a Thread-safe Singleton Design Pattern in C#?

 
 
Bu yazımda thread safe singleton kullanımı, thread safe singleton implementation konusunu inceleyeceğim. Multi-thread ortamda amaçlandığı gibi çalışmasını istiyorsak uygulamamız gereken birkaç işlem bulumaktadır. Lazy initialization tek bir  thread üzerinde çalışır düzgün çalışır fakat multi-thread ortamda, aynı anda birden fazla thread tarafından çağrılan GetInstance metodu birden fazla instance yaratacaktır bu singleton kuralını ihlal eden bir işlemdir.

Bir örnekle tam olarak neyden  bahsettiğimizi somutlaştıralım. Bir önceki yazımızdaki Singleton sınıfını paralel olarak 2 kere çağırdığımızda singleton kuralını ihlal ettiğini görüyoruz. Böylelikle multi-thread ortamda kodumuzu multi-thread safe haline getirmemiz gerekiyor.
 

 private static void YazdırSqllife1()
        {
            Singleton sqllife1 = Singleton.GetInstance;
            sqllife1.Yazdır("Sqllife1");
        }
        private static void YazdırSqllife2()
        {
            Singleton sqllife2 = Singleton.GetInstance;
            sqllife2.Yazdır("sqllife2");
        }

        static void Main(string[] args)
        {

            Parallel.Invoke(
                 () => YazdırSqllife1(),
                 () => YazdırSqllife2()
                 );
            Console.ReadLine();

  }


c# singleton  ihlali sqllife
 

Bu noktada yapmamız gereken işlem, eğer bir instance aynı anda birden fazla kez çağrılıyorsa sadece bir instance üretilmesini garanti altına almamız ve kontrol etmemiz gerekiyor.


Bu kontrol ve garanti işlemini Lock yapısını kullanarak sağlayabiliriz. Bu kullanılan yönteme double checked locking yaklışımı denilmektedir.

 

public sealed class Singleton
    {
        private static readonly object Instancelock = new object();
        private static int counter = 0;
        private static Singleton instance = null;
        public static Singleton GetInstance
        {
            get
            {
                if (instance == null)
                {
                    lock (Instancelock)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }

        private Singleton()
        {
            counter++;
            Console.WriteLine("Kaç Kez Nesne Oluşturuldu-> " + counter.ToString());
        }
        public void Yazdır(string message)
        {
            Console.WriteLine(message);
        }
    }




c# thread safe singleton design pattern
 

Sonuç olarak multi thread ortamda singleton yaklaşımını gerçekleştirmiş bulunuyoruz.
Kafanıza takılan bir durum varsa sorabilirsiniz, destek için reklamlara tıklayabilirsiniz. Bir başka yazıda görüşmek üzere.



 
#
Ezgim Çelik
They didn't know it was impossible, so they did it - Mark Twain