Javaの遅延読み込みの実装原理とは?

Javaの遅延ロード(Lazy Loading)では、オブジェクトが必要になったときにのみインスタンス化と初期化が行われ、それまでは余分なリソースを消費しません。その実現には、シングルトンパターンと二重ロック機構(Double-Checked Locking)が用いられます。

具体的な仕組みは以下の通りです。

  1. クラスのコンストラクタをプライベートにして、そのクラスが外部から直接インスタンス化できないようにする。
  2. インスタンスオブジェクトの保持には、プライベートの静的メンバ変数を作成します。
  3. インスタンスオブジェクトを取得するための、パブリックな静的メソッドを提供します。このメソッド内で、まずはインスタンスオブジェクトが空かどうかを判断します。空であればインスタンス化と初期化を行い、その後インスタンスオブジェクトを返します。空でなければ、直接インスタンスオブジェクトを返します。
  4. マルチスレッド環境でスレッドセーフにするため、公開静的メソッドで二重ロックチェックを使用します。インスタンスオブジェクトがnullかどうかを判断し、nullの場合は同期ブロックに入り、同期ブロック内でインスタンスオブジェクトがnullかどうかを再度判断します。nullの場合はインスタンス化と初期化を行い、インスタンスオブジェクトを返します。

初回の呼び出し時に遅延ロードオブジェクトのインスタンス化や初期化を行い、インスタンスオブジェクトを保持する。以降の呼び出しではすでにインスタンス化済みのオブジェクトを返すことで、再インスタンス化を回避し、パフォーマンスや効率を高める。また、二重チェックロックによって、マルチスレッド環境におけるスレッドセーフティが担保されている。

bannerAds