English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Raccolta di materiali per l'implementazione del modello Singleton in Java

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.

Ti potrebbe interessare