Ainokainen

Ztane 16.05.07 18:39

Säieturvallinen Ainokainen (Thread-safe Singleton) (pakko rakastaa näitä OO-termien suomennoksia) Javassa ilman turhempia penalteja

 Tekstiversio  Arvo: 12 (14 ääntä)  Äänestä: +  -
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?