マルチスレッドに関して評判が良いので、私はjodaを使用しています。たとえば、すべてのDate / Time / DateTimeオブジェクトを不変にすることで、マルチスレッドの日付処理を効率的にすることができます。
しかし、これは、Jodaが本当に正しいことをしているのかどうかわからない状況です。たぶんそうですが、説明を見てとても興味があります。
DateTimeのtoString()が呼び出されると、Jodaは次のことを行います。
/* org.joda.time.base.AbstractInstant */
public String toString() {
return ISODateTimeFormat.dateTime().print(this);
}
すべてのフォーマッターはスレッドセーフです(それらも不変です)が、フォーマッターファクトリーについてはどうですか?
private static DateTimeFormatter dt;
/* org.joda.time.format.ISODateTimeFormat */
public static DateTimeFormatter dateTime() {
if (dt == null) {
dt = new DateTimeFormatterBuilder()
.append(date())
.append(tTime())
.toFormatter();
}
return dt;
}
これはシングルスレッドアプリケーションでは一般的なパターンですが、マルチスレッド環境ではエラーが発生しやすいことが知られています。
次のような危険があります。
- nullチェック中の競合状態->最悪の場合:2つのオブジェクトが作成されます。
これは(通常のシングルトンパターンの状況とは異なり)単なるヘルパーオブジェクトであるため、問題ありません。一方はdtに保存され、もう一方は失われ、遅かれ早かれガベージコレクションされます。
- 静的変数は、オブジェクトの初期化が完了する前に、部分的に構築されたオブジェクトを指している可能性があります
(私をクレイジーと呼ぶ前に、このウィキペディアの記事で同様の状況について読んでください。)
では、Jodaは、部分的に作成されたフォーマッターがこの静的変数で公開されないようにするにはどうすればよいでしょうか。
説明ありがとうございます!
レト