A implementação do padrão Java Singleton foi resolvida vários métodos de implementação do Java Singleton Pattern:
É quantos livros escrevem:
classe pública singleton1 {private singleton1 () {} private static singleton1 instância = null; public static singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } Instância de retorno; }}No entanto, isso não está escrito no desenvolvimento real, porque há um problema sério: quando o acesso simultâneo com vários threads é acessado, várias instâncias podem ser geradas! !
Aqui estão alguns métodos comumente usados:
1. Use palavras -chave sincronizadas
pacote singleton; classe pública singleton1 {private singleton1 () {} private static singleton1 instância = null; // Solução 1 do problema de threading, mas não é eficiente! Porque toda chamada será bloqueada! public static sincronizado singleton1 getInstance () {if (instance == null) {instance = new singleton1 (); } Instância de retorno; } public void print () {System.out.println ("thread_id:"+thread.currentThread (). getId ()); } objeto estático privado objeto = new Object (); // Um método muito inteligente, somente quando o NULL é adicionado, nenhum singleton estático público getInstance2 () {if (instance == null) {synchronized (object) {instance = new singleton1 (); }} retornar a instância; }} 2. Adicione o bloqueio
pacote singleton; importar java.util.concurrent.locks.reentrantlock; classe pública singleton2 {private singleton2 () {} private estático reentrantlock bloqueio = new reentrantlock (); private static singleton2 instância = nulo; public void print () {System.out.println ("Thread_id:"+Thread.currentThread (). getId ()); } public static singleton2 getInstance2 () {if (instance == null) {Lock.lock (); if (instance == null) {// Observe que há outro julgamento aqui! ! instância = new singleton2 (); } lock.unlock (); } Instância de retorno; }} 3. Use variáveis estáticas:
pacote singleton; classe pública singleton3 {public static void print () {System.out.println ("thread_id:"+thread.currentThread (). getId ()); } public static aninhado getnested () {return anade.instance; } // Esta é uma classe criada por uma classe estática singleton aninhada {private aninhado () {}} aninhada estática instância = new aninhada (); }}O exposto acima é o padrão de criação de singleton comumente usado:
Código de teste de teste:
pacote singleton; importar singleton.singleton3.nested; public class Test2 {public static void main (string [] args) {// TODO Método Auto-Gerado Stub Singleton aninhado; MMrunnable mm = new MyRunnable (); MyRunnable M1 = new MyRunnable (); MyRunnable2 m2 = new MyRunnable2 (); novo thread (m1) .start (); novo thread (m2) .start (); if (m1.singleton == m2.singleton) {// é o mesmo sistema.out.println ("é o mesmo"); } else {System.out.println ("não é o mesmo"); }}} classe MyRunnable implementa Runnable {Nested Singleton; @Override public void run () {// TODO Method Auto-Gerated Stub Singleton = singleton3.getnested (); Singleton3.print (); }} classe myRunnable2 implementa runnable {aninhado singleton; @Override public void run () {// TODO Method Auto-Gerated Stub Singleton = singleton3.getnested (); Singleton3.print (); }}Saída:
É o mesmo
Thread_id: 11
Thread_id: 10
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!