English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Implementazione del pattern singleton in Java, ha organizzato alcune implementazioni di singleton in Java:
La singleton pattern è descritta così in molti libri:
public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } }
Ma in pratica lo sviluppo non è così scritto, perché c'è un problema grave: durante l'accesso concorrente multithreading, potrebbero essere creati più istanze!!!
Di seguito sono elencati alcuni metodi comuni:
1. Utilizzo della parola chiave synchronized
package singleton; public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; //Soluzione del problema multithreading una, ma non efficiente! Poiché ogni chiamata aggiunge un blocco di sincronizzazione! 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(); //很巧妙的方法,只有在null的时候加锁,之后就不加啦 public static SingleTon1 getInstance2(){ if(instance == null){ synchronized (object){ instance = new SingleTon1(); } } return instance; } }
2.加锁
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){ //注意这里还要判断下!! instance = new SingleTon2(); } lock.unlock(); } return instance; } }
3.利用静态变量:
package singleton; public class SingleTon3 { public static void print(){ System.out.println("thread_id:"+Thread.currentThread().getId()); } public static Nested getNested(){ return Nested.instance; } //这个是单例创建的类 static class Nested{ private Nested(){ } static Nested instance = new Nested(); } }
以上就是常用的创建单例的模式:
Test测试代码:
package singleton; import singleton.SingleTon3.Nested; public class Test2 { public static void main(String[] args) { // TODO metodo stub generato automaticamente Singleton nested; Myrunnable mm = new Myrunnable(); Myrunnable m1 = new Myrunnable(); Myrunnable2 m2 = new Myrunnable2(); new Thread(m1).start(); new Thread(m2).start(); System.out.println("È lo stesso"); else{ } System.out.println("Non è lo stesso"); } } } class Myrunnable implements Runnable{ Singleton nested; @Override public void run() { // TODO metodo stub generato automaticamente singleton = SingleTon3.getNested(); SingleTon3.print(); } } class Myrunnable2 implements Runnable{ Singleton nested; @Override public void run() { // TODO metodo stub generato automaticamente singleton = SingleTon3.getNested(); SingleTon3.print(); } }
Output:
è lo stesso
thread_id:11
thread_id:10
Grazie per la lettura, spero di essere utile a tutti, grazie per il supporto al nostro sito!
Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, di proprietà del rispettivo autore. Il contenuto è stato caricato autonomamente dagli utenti di Internet, il sito non detiene i diritti di proprietà, non è stato sottoposto a editing umano e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare e fornire prove pertinenti. Una volta verificata, il sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.