Hey,
habe gerade in einem Design-Pattern Buch (Design Pattern von Kopf bis Fuss / Head First Design Pattern)
etwas über's Singleton gelesen. Das meiste verstehe ich:
[HIGHLIGHT="Java"]public class Singleton {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}[/HIGHLIGHT]
Also, wieso die getInstance() so ist, wie sie ist, ist mir schon klar:
Es könnte ja passieren dass 2 Threads gleichzeitig getInstance() aufrufen,
wenn die Instanz noch nicht exisitert. Und dann hat man trotz "Singleton" 2 Objekte.
Deswegen macht diese doppelte null-Prüfung auch Sinn, und das ganze
ist nur deshalb so gemacht, weil Synchronisation teuer ist und wir es nur machen
wenn das Objekt instantiiert werden muss, ansonsten nicht mehr.
Soweit sogut, aber dieses "volatile" verstehe ich nicht so richtig.
Wieso ist das nötig? Ich weiss dass es irgendwas mit Threading/Locking zu tun hat,
aber wenn ich mir die getInstance() ansehe, verstehe ich nicht wie es da noch zu einem Problem kommen kann.
Was bedeutet volatile genau, bzw. welches ungewollte Ereignis könnte eintreten,
wenn ich das weglasse?
Danke
habe gerade in einem Design-Pattern Buch (Design Pattern von Kopf bis Fuss / Head First Design Pattern)
etwas über's Singleton gelesen. Das meiste verstehe ich:
[HIGHLIGHT="Java"]public class Singleton {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}[/HIGHLIGHT]
Also, wieso die getInstance() so ist, wie sie ist, ist mir schon klar:
Es könnte ja passieren dass 2 Threads gleichzeitig getInstance() aufrufen,
wenn die Instanz noch nicht exisitert. Und dann hat man trotz "Singleton" 2 Objekte.
Deswegen macht diese doppelte null-Prüfung auch Sinn, und das ganze
ist nur deshalb so gemacht, weil Synchronisation teuer ist und wir es nur machen
wenn das Objekt instantiiert werden muss, ansonsten nicht mehr.
Soweit sogut, aber dieses "volatile" verstehe ich nicht so richtig.
Wieso ist das nötig? Ich weiss dass es irgendwas mit Threading/Locking zu tun hat,
aber wenn ich mir die getInstance() ansehe, verstehe ich nicht wie es da noch zu einem Problem kommen kann.
Was bedeutet volatile genau, bzw. welches ungewollte Ereignis könnte eintreten,
wenn ich das weglasse?
Danke