English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java单例模式的实现,对java 单例模式的几种实现方法进行了整理:
O padrão singleton é frequentemente escrito assim em muitos livros:
public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1()); } return instance; } }
Mas na prática do desenvolvimento, não seria assim escrito, porque há um problema grave, ao acessar em concorrência multi-threading, pode haver múltiplos exemplos!!
A seguir, alguns métodos comuns são列举ados:
1.usando a palavra-chave synchronized
package singleton; public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; //Solução para problemas de multi-threading, mas não muito eficiente! Porque cada chamada adiciona um bloqueio! public static synchronized SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1()); } return instance; } public void print(){ System.out.println("thread_id:");+Thread.currentThread().getId()); } private static Object object = new Object(); //Muito astuto método, só bloqueia quando null, e depois não mais! public static SingleTon1 getInstance2(){ if(instance == null){ synchronized (object){ instance = new SingleTon1()); } } return instance; } }
2.trancar
package singleton; import java.util.concurrent.locks.ReentrantLock; public class SingleTon2 { private SingleTon2(){ } private static ReentrantLock lock = new ReentrantLock(); private static SingleTon2 instance = null; public void print(){ System.out.println("thread_id:");+Thread.currentThread().getId()); } public static SingleTon2 getInstance2(){ if(instance == null){ lock.lock(); if(instance == null){ //Atenção, aqui ainda precisa ser verificado! instance = new SingleTon2()); } lock.unlock(); } return instance; } }
3usando a variável estática:
package singleton; public class SingleTon3 { public static void print(){ System.out.println("thread_id:");+Thread.currentThread().getId()); } public static Nested getNested(){ return Nested.instance; } //Este é a classe de criação de singleton static class Nested{ private Nested(){ } static Nested instance = new Nested(); } }
Aqui estão os padrões comuns de criação de singleton:
Código de teste: Test
package singleton; import singleton.SingleTon3.Nested; public class Test2 { public static void main(String[] args) { // TODO Auto-geração de ganchos de método singleton interno; Myrunnable mm = new Myrunnable(); Myrunnable m1 = new Myrunnable(); Myrunnable2 m2 = new Myrunnable2()); new Thread(m1).start(); new Thread(m2).start(); if(m1.singleton == m2.singleton){ //é o mesmo System.out.println("é o mesmo"); }else{ System.out.println("não é o mesmo"); } } } classe Myrunnable implements Runnable{ singleton interno; @Override public void run() { // TODO Auto-geração de ganchos de método singleton = SingleTon3.getNested(); SingleTon3.print(); } } classe Myrunnable2 implements Runnable{ singleton interno; @Override public void run() { // TODO Auto-geração de ganchos de método singleton = SingleTon3.getNested(); SingleTon3.print(); } }
saída:
é o mesmo
thread_id:11
thread_id:10
Agradecemos pela leitura e esperamos que isso ajude a todos. Obrigado pelo apoio ao site!
Declaração: O conteúdo deste artigo é de origem na internet, pertence ao respectivo detentor dos direitos autorais, fornecido voluntariamente pelos usuários da internet e carregado automaticamente. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidades legais relacionadas. Se você encontrar conteúdo suspeito de violar direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas. Se confirmado, o site deletará imediatamente o conteúdo suspeito de infringir direitos autorais.)