2017-05-05 5 views

Antwort

0

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); 
    } 
}