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

Материалы для реализации шаблона Singleton в Java

Реализация Java SingletonКраткое изложение нескольких методов реализации Java Singleton

Singleton-паттерн часто пишут в книгах:

public class SingleTon1 {
  private SingleTon1(){ 
  }
  private static SingleTon1 instance = null;
  public static SingleTon1 getInstance(){
    if(instance == null){
      instance = new SingleTon1();
    }
    return instance;
  }
}

  Но на практике такие методы не используются, потому что существует серьезная проблема: при многопоточном доступе могут возникнуть несколько экземпляров!!

Ниже приведены несколько常用的 методов:

1. Использование ключевого слова synchronized

package singleton;
public class SingleTon1 {
  private SingleTon1(){
  }
  private static SingleTon1 instance = null;
  //Метод решения проблемы многопоточности, но он не очень эффективен! Porque cada vez que se llama, se debe bloquear!
  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 Автоматически сгенерированный метод шаблона
    Nested singleton;
    Myrunnable m1 = new Myrunnable();
    Myrunnable2 m2 = new Myrunnable2();
    new Thread(m1).start();
    new Thread(m2).start();
    if(m1.singleton == m2.singleton){ // Это одно и то же
    System.out.println("Это одно и то же");
      else{
    }
      System.out.println("Это не одно и то же");
    }
   }
}
  class Myrunnable implements Runnable{
    Nested singleton;
      @Override
      public void run() {
        // TODO Автоматически сгенерированный метод шаблона
        singleton = SingleTon3.getNested();
        SingleTon3.print();
      }
  }
  class Myrunnable2 implements Runnable{
    Nested singleton;
    @Override
    public void run() {
      // TODO Автоматически сгенерированный метод шаблона
      singleton = SingleTon3.getNested();
      SingleTon3.print();
    }
  }

Вывод:

Это одно и то же

thread_id:11
thread_id:10

Спасибо за чтение, надеюсь, это поможет вам, спасибо за поддержку нашего сайта!

Заявление: содержимое статьи взято из Интернета, авторские права принадлежат соответствующему автору, материал был предоставлен пользователями Интернета в порядке добровольного участия и самостоятельно загружен, сайт не обладает правами собственности, материал не был отредактирован вручную и не несет ответственности за него. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для подачи жалобы,并提供相关证据. При подтверждении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容。

Вам может понравиться