Diese Frage ist alt, aber es ist das erste Google für die Frage getroffen, so hier geht:
Das Ergebnis des Gesprächs eine CertificateFactory
Implementierung ist, und zwar (in Oracle Java) ein sun.security.provider.X509Factory
. Diese Fabrik hat nur statische Instanz-Mitglieder, die [ich habe sie überprüft] Thread-sicher sind. Es hat auch eine Anzahl von synchronized static
Methoden, die anzeigen, dass die Klasse mit Thread-Sicherheit im Hinterkopf gebaut wurde.
Also würde ich in der Praxis sagen, wenn Sie sicher sind, dass Sie Oracle Java (tm) verwenden, dann können Sie Threadsicherheit annehmen; Sie müssen jedoch andere JREs überprüfen, wenn Sie sie verwenden. Sie könnten immer nur um sicher und wickeln Sie den Wert in ThreadLocal
, zB:
private static final ThreadLocal<CertificateFactory> certFactory =
ThreadLocal.withInitial(() -> {
try {
return CertificateFactory.getInstance("x.509");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
und dann später
public Certificate loadCertFrom(String filename) throws IOException, CertificateException {
try (final FileInputStream in = new FileInputStream(filename)) {
return certFactory.get().generateCertificate(in);
}
}