English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)