1 Aperçu
Le modèle singleton présente plusieurs avantages :
(1) Certaines classes sont créées plus fréquemment. Pour certains objets volumineux, cela représente une énorme surcharge système.
(2) Le nouvel opérateur est omis, ce qui réduit la fréquence d'utilisation de la mémoire système et réduit la pression du GC.
(3) Certaines classes, comme le moteur de trading principal d'une bourse, contrôlent le processus de transaction. Si plusieurs classes peuvent être créées, le système sera complètement perturbé.
2 Explication détaillée
Il existe deux manières couramment utilisées d’écrire le modèle singleton comme suit.
2.1 À la chinoise affamée
Si l'application crée et utilise toujours le modèle singleton, ou si la pression de création et d'exécution n'est pas très élevée, vous pouvez utiliser une variable statique privée pour créer l'objet à l'avance.
Copiez le code comme suit :
paquet org.scott.singleton ;
/**
* @auteur Scott
* @version 2013-11-16
* @description
*/
classe publique Singleton1 {
private static Singleton1 uniqueInstance = new Singleton1();
privé Singleton1(){
}
public statique Singleton1 getInstance(){
return uniqueInstance ;
}
}
Dans ce cas, lorsque la JVM chargera cette classe, l'objet aura été créé selon la séquence d'initialisation. Dans le même temps, la JVM peut garantir que tout thread doit créer cette instance d'abord et une seule fois avant d'accéder à cet objet singleton.
Bien entendu, vous pouvez également utiliser une classe interne statique pour accomplir la même fonction.
Copiez le code comme suit :
paquet org.scott.singleton ;
/**
* @auteur Scott
* @version 2013-11-16
* @description
*/
classe publique Singleton2 {
privé Singleton2() {
}
/**
* Une classe interne est utilisée ici pour maintenir le singleton
* */
classe statique privée SingletonFactory {
instance Singleton2 statique privée = new Singleton2();
}
public statique Singleton2 getInstance() {
retourner SingletonFactory.instance ;
}
/**
* Si l'objet est utilisé pour la sérialisation, il peut être garanti que l'objet reste cohérent avant et après la sérialisation.
* */
Objet public readResolve() {
return getInstance();
}
}
2.2 Méthode de double verrouillage
"Double verrouillage", comme son nom l'indique, est constitué de deux verrous. Le premier verrou est utilisé pour vérifier si l'objet d'instance à créer a été créé. S'il n'a pas été créé, le deuxième verrou est utilisé pour la synchronisation.
Copiez le code comme suit :
paquet org.scott.singleton ;
/**
* @auteur Scott
* @version 2013-11-16
* @description
*/
classe publique Singleton3 {
privé volatile statique Singleton3 uniqueInstance ;
privé Singleton3(){
}
public statique Singleton3 getInstance(){
si(uniqueInstance == null){
synchronisé(Singleton3.class){
si(uniqueInstance == null){
uniqueInstance = new Singleton3();
}
}
}
return uniqueInstance ;
}
}
Si les exigences de performances sont relativement élevées, cette méthode peut réduire considérablement le temps de création. Actuellement, cette méthode est également un moyen relativement courant de créer des singletons.