Singleton: Porovnání verzí

Smazaný obsah Přidaný obsah
Vaclav.Makes (diskuse | příspěvky)
vyčištění a sjednocení kódu s předchozími ukázkami
Vaclav.Makes (diskuse | příspěvky)
přidání řešení jedné z nevýhod vzoru
Řádek 267:
==Nevýhody==
 
Při využívání [[Vlákno (program)|vícevláknových]] aplikací se může stát, že první vlákno požádá o vytvoření jedináčka. [[Procesor]] přepne na druhé vlákno, kde ještě není jedináček vytvořen a je spuštěn proces tvorby jedináčka. Poté je přepnuto na první vlákno, kde byl jedináček započat a je dokončen. Už není jedináček, ale je to dvojče. Tomu by se dalo vyhnout [[Synchronizace|synchronizováním]] tovární [[metoda|metody]],. cožSynchronizovat jecelou alemetodu je poměrně drahá operace (synchronizovaná metoda se volá vždy při používánízískání Javyinstance). 5Řešení nenímůžeme nutnéoptimalizovat synchronizovat(v celoupřípadě, továrníže metodupoužíváme Javu 5 a jedináčekvyšší) sepomocí definujedefinování odkazu na jedináčka jako [[volatile)]] a synchronizováním bloku kódu, starající se tvorbu jedináčka.
 
<source lang=java>
public class Singleton {
private static volatile Singleton instance = null;
 
public static Singleton getInstance() {
if (instance == null)
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
return instance;
}
}
</source>
''Řešení problému vícevláknových aplikací v Javě 5<ref name="reftwo"></ref>''
 
Další problém nastává u [[Serializace|serializovatelnosti]] jedináčka. Kdybychom chtěli načítat jedináčka uloženého ze [[stream]]u, například souboru, musíme zkontrolovat, jestli již nějaký takový jedináček neexistuje (Java poskytuje metodu, kterou je tato funkcionalita podpořena, jedná se o readSolve(), tato metoda vrací odkaz na aktuálního (původního) jedináčka, ale umožňuje ho například doplnit o novinky jedináčka ze streamu).