最初に単一のケースを書く:
Public Class Singledemo {private static singledemo s = null; private singledemo(){} public static singledemo getInstance(){if(s == null){s = new singledemo(); } return s; }}テストクラスを書く:
public class threaddemo3 {public static void main(string [] args){singledemo s1 = singledemo.getInstance(); singledemo s2 = singledemo.getInstance(); System.out.println(s2 == s2); }}実行中の結果は常に真です。つまり、単一のスレッドで問題はありません。単一のケースにアクセスするためのマルチスレッドを書いてみましょう。
パブリッククラスのスレッドテスト実装Runnable {// Singletonオブジェクトの保存セットは、重複要素を保存しないことですpublic set <singledemo> singles = new Hashset <singledemo>(); @Override public void run(){// singledemo s = singledemo.getInstance(); // Singleton Singles.Add(s)を追加します。 }}シングルトンへのマルチスレッドの同時アクセスを使用してください。
public class threaddemo3 {public static void main(string [] args){// singledemo s1 = singledemo.getinstance(); // singledemo s2 = singledemo.getInstance(); // system.out.println(s2 == s2); threadtest t = new SthreadTest();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start();新しいスレッド(t).start(); System.out.println(T.Singles); }}
操作結果は次のとおりです。
[com.persagy.thread.singledemo@1bc4459、com.persagy.thread.singledemo@150bd4d]
または
[com.persagy.thread.singledemo@12b6651]
それは、スレッド付きの同時アクセスセキュリティの問題があり、取得したインスタンスが同じではないことを意味します
スレッドの安全性の問題を解決する方法は?
もちろん、同期ロックメカニズムが使用されます。
以下はシングルトンの改善です:
public class singledemo {private static singledemo s = null; private singledemo(){} public static synchlonized singledemo getInstance(){if(s == null){s = new singledemo();} return s;}}}}スレッドの安全性の問題は、同期関数を追加した後に解決されました
同じインスタンスを取得するために複数回実行すると、2つのインスタンスがありません。
[com.persagy.thread.singledemo@12b6651]
ただし、マルチスレッドコンカレントアクセスの場合、各スレッドは、インスタンスを取得するたびにロックを判断する必要があります。これは比較的低い効率です。効率を改善するために、効率の問題を解決するための二重判断方法を追加しました
コードは次のとおりです。
Public Class SingleDemo {private static Singledemo s = null; private singledemo(){} public static singledemo getInstance(){/ *最初のスレッドがSingletonのインスタンスオブジェクトを取得した場合、その後のスレッドがインスタンスを取得した場合、同期コードブロックを入力する必要はありません。 */if(s == null){//同期コードブロックで使用されるロックはシングルトンのバイトコードファイルオブジェクトであり、このロックは同期(singledemo.class){if(s == null){s = new singledemo();}}}}}}}}}}} {s = new singledemo();}}}を使用することができます。この方法は、怠zyな人々のスレッドの安全性の問題を解決し、効率を向上させます。しかし、実際の開発では、より多くの人々が空腹の人々を使用しています。結局のところ、このコードはより複雑で複雑です。
上記は、編集者がもたらすシングルケースデザインモードでの怠zyなスレッドの安全性の問題に対する完璧なソリューションの完全なコンテンツです。誰もがwulin.comをもっとサポートすることを願っています〜