Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Singleton Tasarm ablonu Tasarm ablonlar Serisi

KurumsalJava.com
zcan Acar Bilgisayar Mhendisi http://www.ozcanacar.com

zcan Acar - www.KurumsalJava.com

Bu makale zcan Acar tarafndan yazlm olan Java Tasarm ablonlar ve Yazlm Mimarileri isimli kitaptan alntdr. Detayl bilgiyi http://www.pusula.com adresinden edinebilirsiniz.

zcan Acar - www.KurumsalJava.com

Singleton (Tekillik) Tasarm ablonu


Baz artlar altnda bir snftan sadece bir nesnenin oluturulmas ve oluturulan bu nesnenin tm sistemde kullanlmas gerekebilir. rnein bilgibankas iin bir connection pool (bilgibankas balant havuzu) sadece bir defa oluturulmal ve kullanlmaldr. Bu durumda Singleton tasarm ablonu kullanlarak, bir snftan sadece bir nesnenin oluturulmas salanabilir.

Singleton yapya sahip bir snf inceliyelim:


package org.javatasarim.pattern.singleton; /** * Singleton tasarim sablonu rnegi * * @author Oezcan Acar * */ public class Singleton { /* * Singleton sinifindan olusturulabilecek * tek nesne static sinif degiskeni olarak * tanimlaniyor. */ private static Singleton instance = null; /* * Double check locking yapabilmek * icin kullanilan nesne. */ private static Object lock = new Object(); /**

zcan Acar - www.KurumsalJava.com

* Baska siniflarin new Singleton() * seklinde nesne olusturmalarini, * sinif konstruktorn private * yaparak engellemis oluyoruz. * */ private Singleton() { System.out.println("singletion init()"); } /** * Singleton sinifindan olusturulabilen * tek nesneye ulasmak icin instance() * metodu kullanilir. * * @return Singleton static Singleton nesnesi */ public static Singleton instance() { if(instance == null) { // Double checked locking synchronized (lock) { if(instance == null) { instance = new Singleton(); } } } return instance; } /** * Singleton sinifinda bulunan * bir metod. */ public void printThis() { System.out.println(this); }

Bir singleton snfn tamas gereken baz zellikler vardr. Bunlar: Snf konstruktrlerinin private olmas gerekiyor. Konstruktrleri private olan bir snftan, baka bir snf new operatr ile nesne oluturamaz. Singleton snfndan sadece bir tane nesne oluturulmas gerektii iin, oluturulmas gereken nesneyi snfn static deiskeni olarak tanmlamamz gerekiyor. Yukardaki rnekte private static Singleton instance = null; eklinde bu tanmlamay yapyoruz. Singleton snfnda instance() isminde static bir metodun olmas ve bu metodun static olarak tanmlanm nesneyi geri vermesi gerekiyor. instance() metodu iinde snfn tek nesnesi olacak deiken oluturulur.

zcan Acar - www.KurumsalJava.com

Snf bnyesinde bulunan instance() static metodu byk nem tamaktadr. Amatrce yazlm singleton snflarnda genelde aadak gibi bir instance() metodu grlebilir:
public static Singleton instance() { if(instance == null) { instance = new Singleton(); } return instance; }

Java multi threaded bir sistem olduu iin, yukardaki instance() metodunda new ile birden fazla Singleton nesne oluturulabilir. Gzmzde alan iki thread canlandrarak, bu sorunun nasl olutuunu inceliyelim: Sistemde T1 ve T2 isimlerinde iki thread mecvut. T1 ilk olarak intance() metoduna girdi ve if(instance == null) satrn getikten sonra, java thread scheduler tarafndan bloke edildi. Bu noktada T1 instance = new Singleton() yapamadan devre d kalm oldu. Akabinde T2 almaya balad ve if(instance == null) satrn geti ve zaman yeterli olduu iin instance = new Singleton() yapt. Zaman dolduu iin T2 thread scheduler tarafndan bloke edildi. Kontrol tekrar T1 threadine geti. T1, T2nin daha nce new Singleton() yaptndan habersiz olduu iin, instance = new Singleton() yaparak tekrar instance deikenini oluturdu. Bu durumda ayn nesne arka arkaya iki sefer oluturulmu oldu. Bu durum, sistem tarafndan kullanlan kymetli kaynaklarn oluturulmasnda sorun yaratabilir. Singleton snf ve barndrd nesne sadece ve sadece bir defa oluturulmal. Yukarda yer alan sorunu ortadan kaldrmak iin double checked locking1 mekanizmas kullanlabilir. Bizim rneimizde yeralan instance() metodu double checked locking kullanmaktadr:
/** * Singleton sinifindan olusturulabilen * tek nesneye ulasmak icin instance() * metodu kullanilir. * * @return Singleton static Singleton nesnesi */ public static Singleton instance() { if(instance == null) { // Double checked locking synchronized (lock) { if(instance == null) { instance = new Singleton(); } } } return instance; }

Baknz: http://www.ibm.com/developerworks/library/j-dcl.html

zcan Acar - www.KurumsalJava.com

Tekrar T1 ve T2 threadlerimizi kullanarak, nasl double checked locking metodunun, iki sefer new Singleton() yaplmasn nlediini grelim: T1 instance() metoduna girer ve if(instance == null) satrn deerlendirir. Burada T1 thread scheduler tarafndan bloke edilebilir. Biz edilmediini ve T1in devam ettigini dnelim. T1 synchronized bloguna girdigi andan itibaren, bu bloga T2nin girmesi imkanszdr. imdi T1in syncronozed blouna girdikten sonra bloke edildigini dnelim. Bu durumda T2 sadece synchronized metodunun nne kadar gelip, T1 bu bloktan kana kadar beklemek zorundadr, nk T1 lock nesnesinin synchronized lock mekanzmasn elinde tutmaktadr. T1 bunu geri vermedigi srece, yani synchronized bloundan kmad srece, dier threadler bu bloa girmezler. T1 kontrl tekrar eline aldktan sonra, emin olmak icin bir daha if(instance== null) satiri ile, nesnenin oluturulup, oluturulmadn kontrol eder. Eger T1 synchronized metoduna girmeden bloke olmusa, T2 bloa girmi ve new Singleton() yapm olabilir. Tekrar kontrol edildii iin bu mekanizmanin ismi double checked lockingdir. Metoda ilk girite if(instance == null ) ile kontrol edilir ve kontrol synchronized blounda tekrarlanr. Bu ekilde singleton nesnesinin birden fazla init edilmesi nlenmi olur. Bir test snf ile,singleton nesnesi kontrol edilebilir.
package org.javatasarim.pattern.singleton; /** * Singleton tasarim sablonu test sinifi * * @author Oezcan Acar * */ public class Test { /** * main * @param args */ public static void main(String[] args) { for(int i =0; i < 10; i ++) { Singleton.instance().printThis(); } } }

Ekran cikisi:
singletion init() org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd

zcan Acar - www.KurumsalJava.com

org.javatasarim.pattern.singleton.Singleton@1add2dd org.javatasarim.pattern.singleton.Singleton@1add2dd

Ekran ktsnda grld gibi, singleton snfndan sadece bir nesne oluturuluyor. Bunu singleton init() kts ile gryoruz. Daha sonraki satrlarda ayn nesne kullanlarak, printThis() metodunun kts ekrana geliyor. Singleton tasarm ablonu ne zaman kullanlr?

Sistem bnyesinde bir snftan sadece bir nesne retilerek bu nesnenin kullanlmas gerektii durumlarda singleton tasarm ablonu kullanlr.

likili tasarm ablonlar:

Abstract Factory, Builder ve Prototype tasarm ablonlarnda olabilecei gibi birok tasarm ablonu Singleton tasarm ablonu kullanlarak implemente edilir.

zcan Acar - www.KurumsalJava.com

You might also like