単一モード-静的内部クラス実装(推奨)
1508 ワード
Javaの中で単例モードは1種のよくある設計モードで、単例モードの書き方はいくつかあって、ここで主に3種類を紹介します:怠け者式単例、餓漢式単例、登録式単例.特徴:1、単例クラスには1つのインスタンスしかありません.2、単一のインスタンスクラスは、独自の一意のインスタンスを作成する必要があります.3、単一のクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります.
シーンを使用:
単一のインスタンス・モードは、クラスに1つのインスタンスしかなく、独自にインスタンス化され、システム全体にこのインスタンスが提供されることを保証します.コンピュータシステムでは、スレッドプール、キャッシュ、ログオブジェクト、ダイアログボックス、プリンタ、グラフィックスカードのドライバオブジェクトが単一の例として設計されることが多い.これらのアプリケーションは、リソースマネージャの機能を多かれ少なかれ備えています.各コンピュータには複数のプリンタがありますが、2つの印刷ジョブが同時にプリンタに出力されないように、Printer Spoolerは1つしかありません.各コンピュータにはいくつかの通信ポートがあり、システムは、1つの通信ポートが同時に2つの要求によって同時に呼び出されないように、これらの通信ポートを集中的に管理しなければならない.要するに、単例モデルを選んだのは、不一致状態を避け、政出多頭を避けるためだ.
静的内部クラス実装の一例コード:
メリット:
1.静的内部クラス方式を採用し、一例としてclassLoader(jvmクラスロードメカニズム)で非同期ロック問題を直接処理し、メモリ消費量を減少する
2.怠惰負荷(餓漢式)、すなわち遅延負荷.
3.スレッドセキュリティ.
分析:
1.静的内部クラスを使用する場合、最初の使用時にのみロードされます.
2.同時性を解決するため、主にsynchronizedを使用して反発ロックを追加し、同期制御を行う.しかし、jvmは同期を暗黙的に実行している場合があり、これらの場合、自分で同期制御を行う必要はありません.
|
1>スタティックイニシエータ(スタティックフィールドまたはstatic{}ブロックでイニシャル)によってデータがイニシャルされた場合.
2>finalフィールドにアクセスする場合.
3>スレッドを作成する前にオブジェクトを作成する場合.
4>スレッドが処理するオブジェクトを表示する場合.
シーンを使用:
単一のインスタンス・モードは、クラスに1つのインスタンスしかなく、独自にインスタンス化され、システム全体にこのインスタンスが提供されることを保証します.コンピュータシステムでは、スレッドプール、キャッシュ、ログオブジェクト、ダイアログボックス、プリンタ、グラフィックスカードのドライバオブジェクトが単一の例として設計されることが多い.これらのアプリケーションは、リソースマネージャの機能を多かれ少なかれ備えています.各コンピュータには複数のプリンタがありますが、2つの印刷ジョブが同時にプリンタに出力されないように、Printer Spoolerは1つしかありません.各コンピュータにはいくつかの通信ポートがあり、システムは、1つの通信ポートが同時に2つの要求によって同時に呼び出されないように、これらの通信ポートを集中的に管理しなければならない.要するに、単例モデルを選んだのは、不一致状態を避け、政出多頭を避けるためだ.
静的内部クラス実装の一例コード:
package com.test;
public class Singleton_InnerClass {
//
private static class SingletonHolder {
// ( , )
private static Singleton_InnerClass instance = new Singleton_InnerClass();
}
//
private Singleton_InnerClass() {}
//
public static Singleton_InnerClass getInstance() {
return SingletonHolder.instance;
}
}
メリット:
1.静的内部クラス方式を採用し、一例としてclassLoader(jvmクラスロードメカニズム)で非同期ロック問題を直接処理し、メモリ消費量を減少する
2.怠惰負荷(餓漢式)、すなわち遅延負荷.
3.スレッドセキュリティ.
分析:
1.静的内部クラスを使用する場合、最初の使用時にのみロードされます.
2.同時性を解決するため、主にsynchronizedを使用して反発ロックを追加し、同期制御を行う.しかし、jvmは同期を暗黙的に実行している場合があり、これらの場合、自分で同期制御を行う必要はありません.
|
1>スタティックイニシエータ(スタティックフィールドまたはstatic{}ブロックでイニシャル)によってデータがイニシャルされた場合.
2>finalフィールドにアクセスする場合.
3>スレッドを作成する前にオブジェクトを作成する場合.
4>スレッドが処理するオブジェクトを表示する場合.