1. Hungriger Singleton im chinesischen Stil
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Singleton {
private final static Singleton INSTANCE = new Singleton();
privater Singleton() { }
öffentliches statisches Singleton getInstance() {
return INSTANCE;
}
}
2. Mit Hilfe interner Klassen
Es handelt sich um einen Lazy-Singleton, da der Java-Mechanismus vorschreibt, dass die interne Klasse SingletonHolder nur dann geladen (lazy implementiert) wird, wenn die Methode getInstance() zum ersten Mal aufgerufen wird, und dass ihr Ladevorgang threadsicher ist. Die Instanz wird einmal beim Laden der internen Klasse instanziiert.
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Singleton {
privater Singleton() { }
private statische Klasse SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
}
öffentliches statisches Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
3. Gewöhnliche Verriegelungslösung
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Singleton {
private statische Singleton-Instanz = null;
privater Singleton() { }
öffentlicher statischer synchronisierter Singleton getInstance() {
if(instance == null) {
Instanz = new Singleton();
}
Rückgabeinstanz;
}
}
Obwohl das Thread-Sicherheitsproblem gelöst ist, muss jeder Thread, der getInstance aufruft, nur beim ersten Aufruf von getInstance gesperrt werden. Bitte sehen Sie sich die Lösung zur doppelten Erkennung an.
4. Doppelte Erkennung, aber achten Sie auf die Schreibmethode
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse Singleton {
private statische Singleton-Instanz = null;
privater Singleton() { }
öffentliches statisches Singleton getInstance() {
if(instance == null) {
synchronisiert(Singleton.class) {
Singleton temp = Instanz;
if(temp == null) {
temp = new Singleton();
Instanz=temp
}
}
}
Rückgabeinstanz;
}
}
Aufgrund des Problems der Neuordnung von Anweisungen kann es nicht direkt wie folgt geschrieben werden:
öffentliche Klasse Singleton {
private statische Singleton-Instanz = null;
privater Singleton() { }
öffentliches statisches Singleton getInstance() {
if(instance == null) {
synchronisiert(Singleton.class) {
if(instance == null) {
Instanz = new Singleton();
}
}
}
Rückgabeinstanz;
}
}
Wenn die Instanzvariable jedoch mit „Volatil“ geändert wird, kann sichergestellt werden, dass die entsprechenden Anweisungen von „instance = new Singleton()“ nicht neu angeordnet werden. sicher:
öffentliche Klasse Singleton {
private statische flüchtige Singleton-Instanz = null;
privater Singleton() { }
öffentliches statisches Singleton getInstance() {
if(instance == null) {
synchronisiert(Singleton.class) {
if(instance == null) {
Instanz = new Singleton();
}
}
}
Rückgabeinstanz;
}
}