Java Singletonパターンを実装するいくつかの方法
これは書籍の数です:
パブリッククラスSingleton1 {private singleton1(){} private static singleton1インスタンス= null; public static singleton1 getInstance(){if(instance == null){instance = new Singleton1(); } returnインスタンス; }}ただし、深刻な問題があるため、これは実際の開発では記述されていません。マルチスレッドの同時アクセスにアクセスすると、複数のインスタンスが生成される場合があります。 !
一般的に使用されるいくつかの方法は次のとおりです。
1.同期されたキーワードを使用します
パッケージシングルトン;パブリッククラスSingleton1 {private singleton1(){} private static singleton1インスタンス= null; //マルチスレッド問題の解決策1ですが、効率的ではありません!すべての呼び出しがロックされるからです! public static同期Singleton1 getInstance(){if(instance == null){instance = new Singleton1(); } returnインスタンス; } public void print(){system.out.println( "thread_id:"+thread.currentthread()。getId()); } private static object = new object(); //非常に賢い方法、nullが追加された場合にのみ、public static singleton1 getInstance2(){if(instance == null){synchronized(object){instance = new Singleton1(); }} return instance; }} 2.ロックを追加します
パッケージシングルトン; java.util.concurrent.locks.reentrantlockをインポートします。 public class singleton2 {private singleton2(){} private static reentrantlock lock = new ReentrantLock(); private static singleton2インスタンス= 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インスタンス; }} 3。静的変数を使用します。
パッケージシングルトン; public class singleton3 {public static void print(){system.out.println( "thread_id:"+thread.currentthread()。getId()); } public static Nested getNested(){nested.instanceを返します。 } //これは、Singleton Static Class Nested {private Nested(){} static Nested Instance = new Nested()によって作成されたクラスです。 }}上記は、一般的に使用されるシングルトン作成パターンです。
テストテストコード:
パッケージシングルトン; singleton.singleton3.nestedをインポートします。 public class test2 {public static void main(string [] args){// todo auto-enerated method Stub Nested Singleton; myrunnable mm = new myRunnable(); myrunnable m1 = new myRunnable(); myrunnable2 m2 = new myRunnable2();新しいスレッド(M1).start();新しいスレッド(m2).start(); if(m1.singleton == m2.singleton){//同じSystem.out.println( "is same"); } else {system.out.println( "ISは同じではありません"); }}} class myrunnable runnable {nested singleton; @Override public void run(){// todo auto-enerated method stubton = singleton3.getnested(); singleton3.print(); }} class myRunnable2を実装してRunnable {Nested Singleton; @Override public void run(){// todo auto-enerated method stubton = singleton3.getnested(); singleton3.print(); }}出力:
同じです
thread_id:11
thread_id:10
上記は、Java Singletonモデル情報の編集です。今後も関連情報を追加し続けます。このウェブサイトへのご支援ありがとうございます!