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

Javaの単例モードの実現に関する資料の整理

Java単例モードの実現Javaの単例モードのいくつかの実現方法を整理しました:

単例パターンは多くの本でこのように書かれています:

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

  しかし、実際の開発ではこのように書かれることはありません。なぜなら、マルチスレッドによる並行アクセスの際に、複数のインスタンスが生成される可能性があるためです。

以下にいくつかの一般的な方法を挙げます:

1.synchronizedキーワードを使用して

singleton パッケージ
public class SingleTon1 {
  private SingleTon1){
  }
  private static SingleTon1 instance = null;
  //多线程問題の解決策の一つですが、効率が低いです!なぜなら、毎回呼び出しでロックされるからです。
  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.ロック

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.静的変数を使用して:

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テストコード:

singleton パッケージ
singleton.SingleTonをインポート3.Nested;
public class Test2 {
  public static void main(String[] args) {
    // TODO Auto-生成されたメソッドスタブ
    Nested singleton;
    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){ //同じものです
      System.out.println("同じものです");
    }else{
      System.out.println("同じものです");
    }
   }
}
  class Myrunnable implements Runnable{
    Nested singleton;
      @Override
      public void run() {
        // TODO Auto-生成されたメソッドスタブ
        singleton = SingleTon3.getNested();
        SingleTon3.print();
      }
  }
  class Myrunnable2 implements Runnable{
    Nested singleton;
    @Override
    public void run() {
      // TODO Auto-生成されたメソッドスタブ
      singleton = SingleTon3.getNested();
      SingleTon3.print();
    }
  }

出力:

同じものです

thread_id:11
thread_id:10

ご読覧ありがとうございます。皆様のサポートに感謝します!

声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ