メソッドorg.osgi.framework.Version.toString()
はパフォーマンスの問題を引き起こすことが知られていました ( Bug 324331 - Version.toString から作成された冗長な文字列を参照)。この問題を解決するためにメソッドが変更され、データ競合を伴う遅延初期化が使用されるようになりました (おそらくパフォーマンス向上のため)。
// OSGi Service Platform Release 4 Version 4.3 Core Companion Code
public String toString() {
if (versionString != null) {
return versionString;
}
int q = qualifier.length();
StringBuffer result = new StringBuffer(20 + q);
result.append(major);
result.append(SEPARATOR);
result.append(minor);
result.append(SEPARATOR);
result.append(micro);
if (q > 0) {
result.append(SEPARATOR);
result.append(qualifier);
}
return versionString = result.toString();
}
私が信じているように、これはスレッドセーフではありません。versionString
フィールドの読み取りを並べ替えることができ、メソッドがnull
値を返すことができるからです。私は正しいですか?それとも、適切な同期なしでは呼び出されないため、問題ではないでしょうか?
アップデート
並行性に関する JLS の第 17 章の著者の 1 人である Jeremy Manson によるこのブログ投稿によると、実際に発生する可能性があります。