Java Günlüğüm
Yazılım, Java, BT, azıcık felsefe, biraz mizah...
  • Udemy Eğitimleri
  • Temiz Kod
  • Tasarım Kalıpları
  • Hakkımda
  • Arşiv
RSS
08 Şubat 2015

“Design Patterns – Tasarım Kalıpları” Seminerinin Videosu

Akin Java, Tasarım Kalıpları, Yazılım Modelleme design pattern, Kalıp, tasarım

Eveli gün yani 6 Şubat Cuma günü öğleden sonra Etiya’da Tasarım Kalıpları üzerine bir seminer verdim. Bu seminerin amatörce yaptığım kaydını da burada yayınladım. Bu seminerin sunumuna da buradan ulaşabilirsiniz.

Malum ben bu türden seminerleri davet üzerine ve bedelsiz olarak veriyorum. 2 saati geçmeyecek şekilde, hem bilgilendirici hem de eğlendirici tarzda hazırlayıp verdiğim bu seminerlerle ilgili bilgilere blogumdaki “Seminerler” sayfasından ulaşabilirsiniz.

İyi seyirler.

Toplam görüntülenme sayısı: 921

9 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
03 Şubat 2015

Statik Metotlu Sınıf mı Yoksa Singleton mı? – II

Akin Java, Tasarım Kalıpları, Yazılım Modelleme singleton, statik, statik metot, tek nesne

Bu konuyla ilgili ilk yazıda, yazılımlarımızda statik metotlara sahip sınıfı mı yoksa singleton (tek nesne) kalıbını mı tercih etmemiz gerektiğini sormuştum. Sorumu bir örnekle daha rahat düşünülebilir hale getireyim: “God” isimli bir sınıf oluşturmanız istendi sizden. Bu sınıfın üzerinde “createUniverse()” ya da “sendMessengers()” gibi metotlar olacağını biliyorsunuz. Bu durumda God sınıfını singleton yani tek nesneli sınıf mı yapardınız yoksa nesnesinin oluşturulmasına izin vermeyip, metotlarını statik mi yapardınız?

Bazı arkadaşlar güzel cevaplar verdiler. Onların cevaplarından da yararlanarak konuyu detaylıca cevaplandıralım.

İşin açıkçası ben şöyle düşünüyorum: Nesne-merkezli dillerde aslolan nesne olduğuna göre, statik metotlu sınıf yerine tek nesneli sınıfı yani singletonı tercih etmemiz gerekir. Zaten statik kullanımı mimlidir, olağan şüphelidir ve malesef çoğunlukla nesneye karşı konumlandırılmaktadır. Nesnelerin yönetimi ve çok bellek tüketmesi gibi sorunlar, henüz nesne kavramını anlamamış ama nesne-merkezli bir dili iyi bildiğini düşünenlerin dile getirdiği sebeplerdendir 🙂 Statik kullanımının nesneye tercihin sebebi, nesnenin gereksizliği değil olsa olsa nesnenin anlamsızlığı olabilir.

Yukarıda genel olarak ifade ettiğim bu tercihin pek çok teknik sebebi de var, sıralarsak:

  1. Singleton sınıfla bir miras hiyerarşisi kurup, metotlarını ezmeyi (override) tercih edebilirsiniz. Bu şekilde polymorphic davranış elde edebilirsiniz ki bu durum nesne-merkezli dillerin en temel özelliğidir. Fakat bu durum statik metotlar için geçerli değildir çünkü statik metotlar ezilemezler, sadece nesne metotları ezilebilirler. Bu yüzden polymorphic davranış elde etmek, örneğin “program to interface, not an implementation” gibi prensipleri uygulamak statik metotlu sınıflar ile mümkün değildir. Bir örnek vermek istersek, God sınıfını statik metotlu yaparsanız, örneğin farklı dinlere sahip olanlar, God sınıfından miras alan Allah, Yahweh vb. sınıflarlar oluşturup, üzerindeki “createUniverse()” gibi metotları ezemezler.
    • Bu durum statik metotlu sınıf kullanımının en ciddi kısıtıdır. Bu yüzden sınıflarınızın miras mekanizmasıyla genişletilip (extension) genişletilmeyeceğinden emin olmalısınız. Örneğin java.lang paketindeki Math sınıfındaki metotlar statiktir ve zaten bu sınıf final yapılmıştır. Çünkü hem Math sınıfının nesnesinin oluşturulmaması istenmiş hem de genişletilmesinin önüne geçilmiştir. Aynı durum java.lang.System sınıfı için de geçerlidir. Fakat aynı paketteki Runtime sınıfı, genişletilebileceği düşüncesiyle statik metotlu değil tek nesneli yapılmıştır. Bu durumda farklı amaçlarla Runtime sınıfınıdan miras devralıp metotlarını ezebilirsiniz. Bu yüzden bu tip sınıflarda “getRuntime()” türünden (java.awt.Desktop sınıfında da getDesktop()) metotlar vardır. (Java SE API’sinde “getInstance()” metotlu belki 100den fazla sınıf var.”getInstance()” metoduna bakarak bunların tek nesneli sınıflar olduğunu düşünmeyin. Java SE API’sindeki statik “getInstance()” metotları çoğunlukla yapılandırıcı metot alternatifi olarak kullanılmıştır ve yeni bir nesne döner. Örneğin java.util.Calendar sınıfı.)
  2. Yukarıdaki maddeye çok benzer şekilde, singleton sınıflar, arayüzlerden türetilebilir dolayısıyla da devraldıkları metotlara kod sağlarlar. İlk maddedeki örnek, arayüz kullanımıyla da çözülebilir. Örneğin daha genel düşünüp, Creator isimli bir arayüz oluşurup, bunun God, Allah, Yahweh gibi sınıflarla genişletilmesini sağlamak daha güzel bir çözüm gibi görünüyor. Dolayısıyla “program to interface, not an implementation” prensibi uygulanmış olur.
  3. Singleton nesnenin oluşturulmasını, ihtiyaç noktasına kadar geciktirebilirsiniz. Bu durum sonradan yükleme (lazy loading) olarak adlandırılır. Fakat statik metotlu sınıflar için böye bir durum söz konusu değildir, sınıfın herhangi bir statik üyesine ulaşmanız halinde sınıf belleğe yüklenecektir. Sonradan yükleme aslen burada kısaca ele aldığımızdan çok daha derin bir konudur ve bu konuda daha ayrıntılı bilgi için buraya ve buraya bakabilirsiniz.
  4. Singleton kullanımı, özellikle ilk maddede belirttiğim nedenden dolayı Java dünyasındaki pek çok yapı tarafından statik metotlu sınıfa tercih edilir. Örneğin Spring ve Hibernate çatıları çok açık ve anlaşılır biçimde gerekmedikçe daima nesne kullanmayı tercih ederler. Spring, temel yapısı olan dependency injection (DI) mekanizmasını tamamen nesneler üzerine kurar ve nesnenin singleton olup olmadığını belirtmenize izin verir. Statik metotlu sınıfları ise tipik olarak “nesne üreten” yani factory olarak kullanmanıza izin verir.
  5. Statik kullanımı bulaşıcıdır. Yanlış duymadınız, statik kullanımını, felsefesine uyan yerlere sınırlanmadığınızda, yayılma eğiliminden dolayı bir müddet sonra sizi olur olmadık yerde statik kullanmaya itebilir. Bu durum da sizi sefil bir nesne programcısı yapabilir.

Statik metotlu sınıfın en temel artısı, nesne oluşturmak zorunda olmayışınızdır. Dolayısıyla bellek problemleri, nesnenin hayat döngüsünü yönetmek kodları vs. hep ortadan kalkacak, çalışma-zamanı performansınız ile ilgili daha az sıkıntınız olacaktır. Ama daha önce de bahsettiğimiz gibi, statik metotlu sınıflar yersiz kullanıldığında kodunuzu nesne-merkezli olmaktan çıkaracaktır.

Öte taraftan çok kanallı ortamlarda kullanılmaları durumda iki yapının da problemleri aynıdır, sonuçta tek bir kayak olduğundan, bu kaynakta eşzamanlı herhangi bir güncelleme sıkıntı yaratacaktır. Bu yüzden iki durumda da tedbir almak gerekecektir.

Yukarıdaki tartışmadan da anlaşıldığı gibi özellikle nesne yapılarından faydalanma ve genişletilebilme gibi özelliklerini kullanma söz konusuysa, tek de olsa nesne kullanımı, statik metotlu sınıf kullanımına tercih edilmelidir. Statik kullanımını olabildiğince nesne oluşturmanın anlamsız ve oluşturulan nesneyi ise sistemde gezdirmenin sıkıntılı olduğu durumlarla sınırlandırmamız gereklidir. Bu yazının devamı olarak buraya bakabilirsiniz çünkü bu yazıda, statik kullanımının nerelerde daha uygun olduğunu etraflıca açıklanmıştır.

Toplam görüntülenme sayısı: 1666

10 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
02 Şubat 2015

Yuh! İşte de Uyunmaz ki!

Akin Kültür, Bilgi ve Düşünce

“İşte uyunur mu canım?”, “Kendi evinde değilsin ki?”, “Uykunu almadıysan işte uyuklarsın tabi”… Bu ve benzer uyarılar, işinizdeyken ufak bir şekerleme yaptığınızda hemen duyacağınız cinstendir.

Ben aslen eskiden bu yana, özelikle öğle yemeğini yedikten sonra bir uyku ve uyuklama problemi yaşayan bir insanım. Önceleri yani lisede ve üniversitedeyken bilinçsizdim ve bu durumun herhangi metabolik bir problemle alakası olabileceğini düşünmemiştim. Bundan dolayı özellikle üniversitede öğleden sonraki ilk derslerde odaklanma sorunu çekerdim. Öğrenciliğimde kaldığım yerlerde, yurtlarda vs. yaptığımız arkadaş toplantılarında, konferanslarda vs. de hiç dayanamaz, özellikle akşam yemeklerinden sonra uyuklardım.

Bu konudaki ilk profesyonel vukuatımı, ABD’deki ilk işimde yaşadım. Beni işe alan George Willis, şirketin genel müdürü, bir öğle yemeği sonrası beni, başımı masada ellerimin üzerine koymuş bir şekilde şekerleme yaparken yakalamıştı. Tabi basmıştı kahkahayı 🙂 George, ABD’deki ilk işime başladığım günde ben masamın üstünü silmek için etrafa bakınırken, koşup, tuvaletten bana kağıt havlu getiren adamdı.

Bu olay tek vukuatım olarak kalmadı tabi ki. Sonrasında GE’de örneğin, kendi kubiğimde çalışırken de zaman zaman, envai çeşit insani sebepten dolayı, örneğin işten yorulmadan ya da öğle yemeğinde mesela makarna yemekten, yine öğleden sonraları hafif cinsten, 15-20 dakikalık şekerlemeler yaptığımı ve basıldığımı ! hatırlıyorum.

Türkiye’ye döndükten sonra bu durum daha da sıkıntılı bir hal almaya başladı, bu da tabi bir durumdu. Özellikle gerekli-gereksiz bir sürü insanın katılıp, saatler süren bir kakafoni ile incir çekirdeğini doldurmayacak cinsten kararlar aldıkları toplantılar hakikatten benim konsantrasyonumu düşürüyor, eğer öğle yemeğinden sonra oluyorsa bu cinsten toplantılar, hepten beni zorluyordu. Patronumdan bir seferinde uyarı bile almıştım. Ama beni esas üzen bu uyarı olmadı. Geçen sene uzunca bir süre danışmanlık verdiğim bir yerde, çalışmalarımı doğrudan kendisine sunduğum bir yazılım yöneticisi, yine özellikle öğle yemeklerinden sonra ara sıra şekerleme yaptığımı görmüş ve beni “profesyonel ortama yakışmayacak şekilde davranmakla” suçlayıp, uyarmıştı. Açıkçası bu uyarı, bu konuda aldıklarım arasında beni en fazla inciteni oldu. Benim kadar işine önem veren, konuşması, iş yapış şekli, çıkardığı iş vb. açılardan kaliteli, katma değerli olmaya çalışan (en azından ben böyle biliyorum kendimi 🙂 ) birisinin, hele hele benzer özelliklerle yetiştirmeye çalıştığı 3 çocuk babası olarak benim “profesyonel olmamakla suçlanmam” hakikatten acı verici. Tabi ben durumumu, 40 küsur yaşında olmanın verdiği özgüvenle açıkladım karşı tarafa. Hatta bu durumumu dedi-kodu vesilesi olmaması için bir kaç kere iş ortamında dile getirdim.

Ben 30’lu yaşların başından bu yana 2. tip şeker hastasıyım. Yani şeker hastalarının ezici çoğunluğunda olduğu gibi, hücrelerim, içindeki mitekondrilerin enerji üretmesi için gerekli olan şekeri kandan emmekte tembel davranıyorlar (insülin direnci denen şey), bu yüzden ilaç kullanıyorum (spor yapmak, yürümek gibi şeyler zaten çok zor!) ve glikemik indeksi düşük, örneğin bol lifli yiyecekler tüketmeye çalışıyorum. Bu durum aslen metabolik bir problem, ne bir yara ile ilgili ne de mikrobik bir hastalık. Çağımızın pek çok diğer hastalığı gibi de aslında sebepsiz, en azından biz henüz sebebini bilmiyoruz. Etrafımda, kilosu biraz fazla ve aşırı şeker ve karbonhidrat tüketen kişileri görünce, abiliğime sığınıp, hafiften kulaklarına su da kaçırıyorum. Çünkü bu gibi kişiler bence, benim bir zamanlar yaptığım gibi, şeker hastası olmak için bayağı çabalıyorlar!

Çağımızın bizi bedenen olmasa bile zihnen ve psikolojik olarak çok yorduğu açık. Eski insanlara göre belki işte daha az süre harcıyoruz ya da dışarıdan bakıldığında daha az iş yapıyor görünebiliriz ama işlerin zihnimizi yorma seviyesi ve stres, çok yükseklerde.

Aslında ben ve benim gibilerin yaptıkları, işte uyumak değil, uyuklamak bile denmez. Bastıran rehaveti atmak, motivasyon yenilenmesi yapmak, günün geri kalanı için enerji toplamak için bir özel davranış şekli, bu yüzden şekerleme diyorum buna. Ben işte niye uyurum? Kendimi rezil etmek için değil herhalde. Örneğin, eğitim verirken, öğle aralarında yemekten sonra bilerek ve isteyerek, koltuğuma kaykılıp, 15-20 dakika uyurum, çünkü eğitim vermek yorucu bir iştir, hem zihnen hem de fiziken yoruluyorum. Müşteride eğitim verirken, onların eğitim salonlarında bile yaparım bunu.

Geçenlerde Yaşar Safkan ile sohbet ederken bu uyuma mevzusu nasılsa gündeme geliverdi. Kendisi de öğleden sonraları ufak şekerlemeler yapmaya ihtiyaç duyduğunu ve bunun kendisine ciddi enerji verdiğinden bahsetti. Hatta kendine rahat kestirebileceği bir sandalye almış, işinde kullanıyormuş. Arkadaşımız Yaşar, Boğaziçi’nden çift ana dal ile mezun olup sonrasında MIT’den Ph.D. almış birisi. Zeka tarafını vurgulamıyorum, disiplin, vizyon, kendine güven gibi noktaları vurguluyorum bunu söyleyerek. Ama malesef kendisi de benim gibi durumlara düşmüş 🙂 Bana “Google’da çalışanların uyuması için özel yerler hazırlanır, burada ise dedi-kodusunu yaparlar” dedi bana.

Tüm bunların üzerine, Stanford öğrencilerine sağlıklı bir yaşam için faydalı yazılar ve ipuçları veren Student Health 101 isimli dergide, öğrencilerle yapılan röportajların birinde, bir öğrenci gün içinde kısa şekerlemeler yaptığını (kendisi buna micro-napping diyor) söyleyince artık bu yazıyı yazmanın zamanı gelmiş diye düşündüm.

Screen Shot 2015-01-16 at 02.21.39

Açıkçası, bu kadar insani bir durumu savunmak için hiç bir başka delile ihtiyacım yok. Aklıma gelmedi değil, bu yazıyı da tonla bilimsel makale, Google vb. büyük şirketlerin uygulamaları, ne bileyim Japonların işte uyuma gelenekleri vb. şeylerle doldurmak. Ama sonra dedim ki kendime, aslında toplumdaki pek çok kişinin ihtiyacı olan bir şeyin tabi olduğunu kabullenmek bu kadar mı zor? Bu kadar mı insan olarak kendimizi tanımaktan uzağız? İlla Obama da mı oval ofisinde şekerleme yaparken yakalanmalı yani?

 

Toplam görüntülenme sayısı: 1340

15 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
02 Şubat 2015

Tasarım Kalıpları – VI: Singleton (Tek Nesne) – III ve Double-Checked Locking (devam)

Akin Java, Tasarım Kalıpları, Yazılım Modelleme design pattern, singleton, tasarım deseni

Bir önceki yazıda tek nesne yani singleton tasarım kalıbının, sonradan yükleme ile çok kanallı halde etkin bir şekilde nasıl kullanılacağını ele aldık ve “singleton == null” kontrolünü iki defa yaparak double-checked locking kalıbını elde etmiştik. Bu koda ulaşırken kendimizi hakikatten bir mühendis gibi hissetmiştik ve elde ettiğimiz kod da son derece çekiciydi. Ama size şimdi bununla ilgili başka bir şey söylemek istiyorum, lütfen sıkı durun: “double-checked locking kalıbı, zekicedir ama çalışmaz!” Evet yanlış duymadınız, JavaWorld dergisinde 8 Şubat 2001 yılında yayınlanan yazıda double-checked locking yaklaşımının gerçekte her zaman doğru çalışmayabileceği gerçeği geniş bir şekilde açıklandı. Aslında Java’nın o anki bellek yönetim modeline göre bu kalıbın bu haliyle çalışmayacağı daha önce güçlü bir grup bilim insanı tarafından “The “Double-Checked Locking is Broken” Declaration” başlığıyla açıklanmıştı. Hatta bu açıklamada ismi bulunan Bill Pugh, burada, içinde bu konunun da dahil olduğu, Java’nın bellek modeliyle ilgili pek çok bilgiyi ve referansı tutan bir sayfa da hazırlamıştı.

Kısaca açıklamak gerekirse, double-checked locking kalıbındaki problem, genel olarak bellek yapılarından kaynaklanıyor. Biraz gaz ve toz bulutundan başlarsak, bizler genelde bilgisayarın klasik Von Neumann modeline göre, her şeyin kodda belirttiğimiz sırada yapılacağını varsayıyoruz. Bu durumda herşeyin yazdığımız gibi ardışıl (sequential) bir şekilde olduğunu düşünüyoruz. Halbuki işletim sistemleri, derleyiciler, JVM gibi çalışma zamanı yapıları, bizim yazdığımız kodu daha etkin çalıştırmak için hemen her türlü taklayı daha formal ifadeyle iyileştirmeyi (optimization) yaparlar. Hatta bu türden etkin kod çalıştırma gayretleri donanım seviyesine kadar çoktan inmiş ve işlemcilerin (CPU) yapılarıyla, değişik paralelleştirme (pipelining) ve tahmin etme (branch prediction) vb. teknikleri kullanılarak daha etkin çalışma zamanları oluşturulmaya çalışılmıştır. (Bu konu tabi olarak bilgisayar mimarisinin (computer architecture) detaylarıdır.) Örneğin “A a = new A()” ifadesinde biz yapılandırıcı çağrısının her zaman atamadan önce yapıldığını farz ederiz ama gerçekte durum böyle olmayabilir. Sistem önce nesne için bellekte yer ayırıp sonra atamayı yapabilir ve yapılandırıcı çağrısını en sona bırakabilir. Bu durumda kısa bir süre için de olsa “a” referansı henüz yapılandırıcı çağrısı yapılmamış bir nesne görecektir. Bu durumda da nesne, değişkenleriyle ilgili tutarsız, en iyi durumda varsayılan değerlere sahip durumda olacaktır.

Yukarıdaki durum, birden fazla işlemcinin, birden fazla çekirdeğin, bir işlemci ya da çekirdekte birden fazla donanım kanalının (hardware thread) ve nihayetinde işletim sistemi ve JVM içinde farklı kanalların olduğu ortamlarda daha da karmaşık bir hal alır. Bu açıdan var olan bellek modelleri (memory models), tüm bu farklı yapılar arasında bellek uyumunu (memory synchronization) sağlamak yerine, en basit yolu tercih edip, temelde herhangi bir uyumlaştırma yapmayıp, uyumlaştırma isteklerini, gelecek işaretlere bağlamıştır. Aksi taktirde, hiç de gereği yokken örneğin birden fazla işlemcinin ya da  bir çok kanalın belleklerini uyumlaştırmaya çalışmak son derece pahalı işlerdir. Sistemler yukarıda da dediğim gibi genelde herhangi bir uyumlaştırma isteği ya da işareti olmadan en basit haliyle işleri yapmaya devam etme eğiliminde olurlar.

Şimdi biraz daha Java’ya özgü açıklamaya girişirsek, Java’nın bellek yapısınından bahsetmemiz gerekir. Çünkü Java, tüm bu farklı yapıların değişik davranışlarını, farklılıkları giderecek şekilde ve yeknesak bir çatı altında bize sunduğundan, onun da bir bellek modeli olması beklenir. Java bellek modelinde, “önce olur” anlamına gelen “happens-before” yaklaşımı vardır. Yani hangi durumlarda olayalr arasıdna öncelik-sonralık ilişkisinin olduğu belirlenmiştir. Bu belirlemler altyapının, var olan kodla ilgili tekrar sıralama gibi inisiyatifler almasını önler. Örneğin, bir nesnenin finalizer bloğunun çalışması, muhakkak o nesnenin yapılandırıcısının bitmesinden sonra olabilir. (Java’nın bellek modeli hakkında daha geniş bilgi için, aynı zamanda Java World’deki yazının da yazarı olan Brian Goetz’in “Java Concurrency in Practice” isimli kitabının 16. bölümü olan Java Memory Model’i okumanızı tavziye ederim. Bu konuda okuması zor olmakla birlikte Java SE speclerinin “Threads and Locks” bölümlerinin Java Memorry Model ile ilgili kısımları da düşünülebilir.)

Java bellek modelinde happens-before ilişkisini sağlayan yapılardan ikisi ise synchronized ve volatile anahtar kelimeleridir. Malum, synchronized anahtar kelimesi, farklı kanallar arasında serilik (serialization) sağlar, dolayısıyla bu kelimeyle tanımlanan kod alanları aynı anda birden fazla kanal tarafından çalıştırılamazlar. Ayrıca, Java’nın bellek modeline göre, synchronized bloğa giren her kanal, önce bu blokta kilitlenmiş bütün değişkenlerin değerlerini ana bellekten okur ve sonrasında bloktaki kodu çalıştırır. Benzer şekilde synchronized bloktan çıkan kanal da, çıkmadan hemen önce, blokta değerini değiştirdiği her değişkenin yeni değerini ana belleğe yazar ki bu korunaklı bloğa girecek bir sonraki kanal, tüm değişkenlerin değerlerini tutarlı bir şekilde görebilsin. Bu mekanizma, kanalın yerel (local) belleği ile JVM’in ana belleği arasındaki haberleşmedir. Ancak bu şekilde bir kanalın, synchronized blokta yaptığı değişiklikler bir başka kanal tarafından doğru bir şekilde görülebilir. Benzer şekilde volatile olan bir değişkenin değerini değiştirmek muhakkak olarak o değişkenin en son değerinin okunmasından sonra olmalıdır. Eğer değişkeninizi volatile olarak tanımlamazsanız, diğer kanalların bu değişkene yaptığı değişiklikleri görmeyebilirsiniz. Bu anlamda volatile anahtar kelimesi, kod bloku seviyesinde değil ama değişken seviyesinde bir serilik sağlar.

Double-checked locking kalıbındaki problem ise, basitçe synchronized blokta kilitlenen nesnenin sınıf nesnesi yani ThreadSafeLazySingleton.class olması, oluşturulan singleton nesnesinin ise kilitlenmemesidir. Bu durumda JVM, derleyicinin üretmiş olduğu bytecodeun çalıştırılmasında, bytecodeların sırasıyla ilgili öyle değişiklikler yapabilir ki singleton nesnesi, diğer kanallara tutarsız bir şekilde görünebilir. Yukarıda bahsettiğim açıklamada, o yıllarda ki 96-97lerden bahsediyoruz, çok kullanılan bir JIT olan Symantec JIT’nin double-checked locking kalıbı için ürettiği makina kodu vardır ve bu kod, yukarıda bahsettiğim işlerde sıralamayı değiştirmekte ve o yazıda da bahsedildiği gibi yapılandırıcı çağrısı en sona kalmaktadır. Bu da bazı kanalların, henüz oluşturulmamış nesneyi gösteren referansa yani singleton referansına ulaşması anlamına gelecektir.

Nihayetinde, bir JVM’de çalışan bütün kanalların varsayılan durumda birbirleriyle sürekli olarak haberleşmesi çok ciddi karmaşıklık ve performans problemi getirecektir. Bu yüzden kodu yazan kişi, kanallar arasındaki muhtemel bu tür problemlerin olması önlemek üzere JVM’e belli işaretler vermesi gerekir. Yukarıda bahsettiğimiz gibi, synchronized ve volatile anahtar kelimeleri bu işaretlerdendir. Dolayısıyla, singleton referansına yapılan değişiklikleri diğer kanalların aynen görmesini istiyorsak, bu referansı volatile olarak tanımlamalıyız. volatile anahtar kelimesi, kendisiyle nitelenen değişkenin değerinin, bir yerlerde cachlenmek yerine daima ana bellekten okunmasını ve kendisiyle ilgili değer atama ve okuma gibi işlerin sırasının değiştirilmeden yapılmasını sağlar. Burada hatırlatmam gereken bir diğer husus da volatile anahtar kelimesinin Java’da en başından bu yana olmasına rağmen, “happens before” ilişkisini sağlaması Java SE 5 ile olmasıdır. Dolayısıyla volatile anahtar kelimesinin kullanılarak, kalıbın bu şekilde bu doğru olarak çalışması için, kullandığımız Java SE sürümünün 5 (JDK 1.5) ve sonrası olması gereklidir.

Bu açıklamadan sonra tek nesne kalıbımızın, sonradan yüklemeli haliyle, double-checked kalıbıyla (ve kanal uyutmasını kaldırdığımızdaki) gerçekleştirilmesi şöyle olacaktır:

package org.javaturk.dp.pattern.gof.creational.singleton;

public class ThreadSafeTrueLazySingleton {

	private static volatile ThreadSafeTrueLazySingleton singleton;

	private static int count;
	private String name;

	private ThreadSafeTrueLazySingleton() {
		name = "ThreadSafeTrueLazySingleton" + count;
		count++;
	}

	public static ThreadSafeTrueLazySingleton getInstance() {
		if (singleton == null) {
			synchronized (ThreadSafeTrueLazySingleton.class) {
				if (singleton == null) {
					singleton = new ThreadSafeTrueLazySingleton();
				}
			}
		}
		return singleton;
	}

	public void printName() {
		System.out.println(name);
	}
}

Tek nesne tasarım kalıbıyla ilgili sonraki yazımızda da kullanım alanlarından ve eleştirilerinden bahsedelim.

Toplam görüntülenme sayısı: 2411

11 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 24 25 26 27 28 >»

Günlüğüme Hoşgeldiniz

Bu günlükte, Yazılım Mühendisliği, Bilgi Teknolojileri, Java, kişisel gelişim ve zaman zaman da diğer konulardaki düşüncelerimi sizlerle paylaşacağım. Umarım beğenir ve hoşça vakit geçirirsiniz.

Her türlü düşüncenizi, yorum olsun, beğeni ya da eleştiri olsun, bana iletmenizi rica ediyorum sizden. Ayrıca bana akin@javaturk.org adresinden ya da Twitter'dan ulaşabilirsiniz. Videolarıma da buradan ulaşabilirsiniz.

Teşekkür ederim.

Akın Kaldıroğlu

Rahat Okumak İçin

A Decrease font size. A Reset font size. A Increase font size.

Sosyal Medya

  • Twitter
  • Facebook
  • LinkedIn
  • Youtube

Son Twitlerim

→ Takip Etmek İçin

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Son Yazılarım

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri
  • Spring ile Kurumsal Yazılım Geliştirme
  • Corona Günlerinde Design Patterns
  • Corona Günlerinde Java
  • JDK 10 ve “var” Özelliği
  • Onur Özcan
  • Analist ve İş Bilgisi
  • Farklı Dillerin Bakış Açısıyla Nesne-Merkezli Programlama
  • Java Nedir?
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I
  • Alelade Hikayeler – II: Bir Başka Performans Problemi

Yazı Kategorileri

Yazı Takvimi

Mart 2026
P S Ç P C C P
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
« May    

Yazı Arşivi

Blogroll

  • Binnur Kurt'un Günlüğü
  • Ender'in Java Blogu
  • Erdem Seherler
  • Kızımın Günlüğü
  • Kurumsal Java
  • Levent Karagöl
  • Levent'in Java Blogu
  • Mert Can Akkan’s java tips,options, news…
  • Yaşar Safkan
  • Yasin Saygılı
  • Yazı Dünyası

Yazı Etiketleri

analiz Bilmek C Desen design pattern EJB Eğitim Fortran Hibernate Java Java'ya nasil baslarim Java dersleri Java EE Java Persistence API Java SE Java Sertifika Java Öğren Java öğreniyorum Java öğrenmek JPA Kalıp Kurumsal Java nesne nesne-merkezli No Silver Bullet object object-oriented Oracle Java Certifications pattern performans programlama programlama dilleri programlama nedir sertifika singleton tasarım tasarım deseni tasarım desenleri tasarım şablonu yazılım yazılım geliştirme Yazılım Mühendisliği yazılımın doğası yazılımın zorlukları Şablon

↑

© Java Günlüğüm 2026
Powered by WordPress • Themify WordPress Themes
 

Yorumlar Yükleniyor...