1. Soltero hambriento al estilo chino
Copie el código de código de la siguiente manera:
clase pública Singleton {
INSTANCIA Singleton estática final privada = new Singleton();
singleton privado() { }
getInstance público estático Singleton() {
devolver INSTANCIA;
}
}
2. Con la ayuda de clases internas.
Es un singleton diferido porque el mecanismo de Java estipula que la clase interna SingletonHolder solo se cargará (implementará de forma diferida) cuando se llame al método getInstance () por primera vez, y su proceso de carga es seguro para subprocesos. La instancia se crea una instancia una vez cuando se carga la clase interna.
Copie el código de código de la siguiente manera:
clase pública Singleton {
singleton privado() { }
clase estática privada SingletonHolder {
INSTANCIA Singleton estática final privada = new Singleton();
}
getInstance público estático Singleton() {
devolver SingletonHolder.INSTANCIA;
}
}
3. Solución de bloqueo ordinaria
Copie el código de código de la siguiente manera:
clase pública Singleton {
instancia privada estática Singleton = nula;
singleton privado() { }
público estático sincronizado Singleton getInstance() {
si (instancia == nulo) {
instancia = nuevo Singleton();
}
instancia de devolución;
}
}
Aunque el problema de seguridad del hilo está resuelto, cada hilo que llama a getInstance debe estar bloqueado. Queremos bloquear solo la primera vez que se llama a getInstance. Consulte la solución de detección doble a continuación.
4. Doble detección, pero preste atención al método de escritura.
Copie el código de código de la siguiente manera:
clase pública Singleton {
instancia privada estática Singleton = nula;
singleton privado() { }
getInstance público estático Singleton() {
si (instancia == nulo) {
sincronizado (Singleton.class) {
Temperatura singleton = instancia;
si(temperatura == nulo) {
temperatura = nuevo Singleton();
instancia=temp
}
}
}
instancia de devolución;
}
}
Debido al problema de reordenamiento de las instrucciones, no se puede escribir directamente de la siguiente manera:
clase pública Singleton {
instancia privada estática Singleton = nula;
singleton privado() { }
getInstance público estático Singleton() {
si (instancia == nulo) {
sincronizado (Singleton.class) {
si (instancia == nulo) {
instancia = nuevo Singleton();
}
}
}
instancia de devolución;
}
}
Pero si la variable de instancia se modifica con volátil, estará bien. Si se modifica con volátil, puede garantizar que las instrucciones correspondientes de instancia = new Singleton () no se reordenen. El siguiente código singleton también es un subproceso. seguro:
clase pública Singleton {
instancia privada estática volátil Singleton = nulo;
Singleton privado() { }
getInstance único estático público () {
si (instancia == nulo) {
sincronizado (Singleton.class) {
si (instancia == nulo) {
instancia = nuevo Singleton();
}
}
}
instancia de devolución;
}
}