入力引数を取るシングルトンを作成する必要があります。基本的に、いくつかの構成に基づいてライブラリに DBConnector を作成する必要があります。これで、この構成は、消費するアプリによってライブラリに渡されます。渡された構成に基づいて、ライブラリで再利用される DBConnector のインスタンスを作成したいと考えています。これを処理するために DI を使用することを考えましたが、このライブラリが初期化されると、DB 接続が実際に必要かどうかわかりません。必要でない場合は、この DBConnector を作成したくありません。ライブラリが初期化されると、getResponse(RequestType rt) の呼び出しで、(RequestType に基づいて) DBConnector が必要かどうかがわかり、そのときにインスタンスを作成する必要があります。したがって、以下のコードはマルチスレッド環境に適していますか?
public class DBConnectorFactory
{
private static volatile DBConnector dBConnector = null;
private static AtomicReference<DBConnector> atomicReference = new AtomicReference<>();
private DBConnectorFactory()
{}
public static DBConnector getDBConnector(DBConfig dBConfig)
{
if(dBConnector == null)
{
if(atomicReference.compareAndSet(null,new DBConnector(dBConfig)))
dBConnector = atomicReference.get();
return atomicReference.get();
}
else
return dBConnector;
}
}
EDIT マルチスレッドテストを書き、すべてのスレッドが同じインスタンスを取得しています。ただし、Java メモリ モデルが原因でエッジ ケースを見逃さないようにしたいだけです。