Singleton Design Pattern-Thread Safe (Tasarım Örüntüsü)

Metin Alnıaçık
2 min readOct 6, 2018

--

Eğer singleton design pattern ile ilgili fazla bilgiye sahip değilseniz, aşağıda bağlantı adresi verilmiş olan yazımı okumanızı tavsiye ederim.

Singleton Design Pattern (Thread Safe Olmayan Örnek)

Bir thread getInstance metodunu çağırdığında, 1. kısımdaki synchronized keyword’u ile 2. kısımda işaretlenmiş olan kısımı kilitler. Artık bir başka thread bu kısma giremez. Diğer thread’lerin bu kısma girebilmesi için ilgili thread’in synchronized bloğundan çıkması gerekir. Fakat bu kısımda performans ile ilgili ciddi bir sıkıntı vardır. Her getInstance metodu çağırıldığında yani bir başka thread, ilgili metodu çağırdığında kilitleme işlemi gerçekleşir ve bu çok maliyetli bir iştir. Bunu çözmek için synchronized kısmının bir üst satırına instance’ın null olma koşulu eklenmelidir. Bu sayede instance null değilse kilitleme işlemi gerçekleşmeyecek sadece gerekli durumda devreye alınacaktır.

İlgili kod yukarıdaki gibi güncellenirse, performans olumlu yönde etkilenecektir.

Son olarak ise;

private static SingletonPatternThreadSafeExample instance;
satırı
private static volatile SingletonPatternThreadSafeExample instance; şeklinde düzenlenmesi gerekir. Volatile keyword ise bir thread ilgili değeri değiştirip cache’ledikten sonra diğer thread’lerin cache’deki değere değil, ana bellekteki asıl değere erişmek istendiğinde kullanılır.

Önemli problemlerden bir tanesi de bir singleton instance, bir dosyaya yazıldıktan sonra tekrar instance haline getirildiğinde farklı adres göstermektedir.

Bu problemi çözmek için SingletonPatternThreadSafeExample class’ına bir ekleme yapmamız gerekiyor.

readResolve metodunu eklenip tekrar çalıştırıldığında aşağıdaki sonucu vermektedir.

Son olarak, Clone metodu bizim için problem yaratabilir. Eğer class’ımızı Cloneable interface’inden implement ettikten sonra Clone metodunu yazarsak super.clone() metodu çalışacaktır. Bu durumda singleton design pattern devre dışı kalacaktır.

Yukarıdaki gibi tanımlandıktan sonra,

Sonuç false olarak dönecektir. Bu problemi çözmek için singleton design pattern uygulanmış class’a aşağıdaki şekilde bir metot eklenmelidir.

32 numaralı satırdaki gibi clone metodu eklenmelidir. Bu sayede clone’lanmaya çalışıldığında exception fırlatacaktır.

Test sonucu konsol aşağıdaki gibidir;

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--