| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
AinokainenZtane 16.05.07 18:39 Säieturvallinen Ainokainen (Thread-safe Singleton) (pakko rakastaa näitä OO-termien suomennoksia) Javassa ilman turhempia penalteja
import java.util.concurrent.atomic.AtomicReference; public class Singleton { // volatile takaa, että näennäiskone ei säilöskele viittauksen arvoa private static volatile AtomicReference<Singleton> instance = new AtomicReference<Singleton>(); // rakennin on yksityinen, jotta luokan käyttäjä ei loisi ilmentymiä omin päin private Singleton() { // tähän normaali rakenninkoodi... } // ja tässä siis metodi, joka palauttaa viittauksen ainokaiseen // ilmentymään, minimipenaltilla. public static Singleton getInstance() { // eli jos viittaus on null, Singleton ref = instance.get(); if (ref == null) { // synkronoi säikeistys LUOKAN monitoria vasten synchronized (Singleton.class) { // tarkista uudelleen - on mahdollista // että useampi säie voi yrittää luoda ainokaista // samanaikaisesti if (instance.get() == null) { // ja luo ilmentymä - taatusti vain yksi kappale, // ja getInstance-metodi ei lainkaan hidastu // normaalitapauksessa. instance.set(new Singleton()); } } return instance.get(); } // joka tapauksessa, palauta viittaus return ref; } } Ztane 18:40 16.5.07 Hehe, kerrankin tein tämän kaikkien taiteen sääntöjen mukaan, toivottavasti. ZcMander 13:25 19.5.07 Eikös getInstance-metodin ensimmäinen iffi ole ihan turha, koska se kuitenkin tarkistetaan myöhemmin? Meinaan että eka synkronisois ja sitten vasta tarkistais. Ztane 14:41 19.5.07 Ei, koska synkronointi maksaa enemmän kuin if ;) Se vaatii moniprosessoriympäristössä vaikka ja ties mitä. editoitu: 22:42 20.5.07 renni 22:42 20.5.07 Ei tämäkään vielä täydellinen mutta ihan oppikirjaesimerkin mukainen joten ei huonokaan. ;) Ztane 00:03 21.5.07 Siis laitoin tämän vain tänne kun sattuin moisen 5 minuuttia aikaisemmin tekemään. T.M. 13:44 22.5.07 singleton = ainoa kortti Sanakirjan mukaan :P _Pete_ 09:32 23.5.07 IntelliJ IDEA:ssa kun templatesta tekee uuden Singleton luokan siitä tulee tällanen: public class Idea { private static Idea ourInstance = new Idea(); public static Idea getInstance() { return ourInstance; } private Idea() { } } litra 09:50 23.5.07 _Pete_ kirjoitti: IntelliJ IDEA:ssa kun templatesta tekee uuden Singleton luokan siitä tulee tällanen: public class Idea { private static Idea ourInstance = new Idea(); public static Idea getInstance() { return ourInstance; } private Idea() { } } No tuo on se kaikkein yksinkertaisin ratkaisu, muttei esim thread safe- mikka 12:19 23.5.07 Kyllä tuo IDEA:n template on thread-safe. JVM pitää huolen siitä että luokan latauksen yhteydessä alustettavat staattiset kentät alustetaan vain kerran. Ztane 17:24 23.5.07 Jep, erona tuossa on se, missä vaiheessa luokka instantioidaan. Tarve oli viivästyttää se niin myöhään kuin mahdollista. Ztane 17:36 23.5.07 tämäpä ei ole välttämättä tarpeeksi thread-safe, ilmeisesti kääntäjä voi tallettaa arvon referenssiin ennen konstruktorin kutsumista, kuten sivulla http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=3 kerrotaan. Muutetaan käyttämään atomic-referenceä ;) harja 08:23 24.5.07 Tämä on kyllä jo aika overkill normaaliympäristöön, mutta hyvä esimerkki siitä miten paljon asioita pitää ottaa huomioon tehtäessä thread safe-koodia. Ztane 16:37 24.5.07 harja: samaa mieltä ;) eis 19:30 23.8.07 T.M. kirjoitti: singleton = ainoa kortti Sanakirjan mukaan :P Meinaatko oikeasti ettei termi 'singleton' ole tuttu? |
![]() Haku
|