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

Material de implementação do padrão Singleton em Java

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.)

Você pode gostar