已知方法org.osgi.framework.Version.toString()
会导致性能问题(请参阅错误 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 章并发性的作者之一 Jeremy Manson 的这篇博客文章,它实际上是可以发生的。