2017-05-05 29 views

Trả lời

0

Câu hỏi này là cũ nhưng đó là google đầu tiên nhấn cho câu hỏi, vì vậy ở đây đi:

Kết quả của cuộc gọi của bạn là một việc thực hiện CertificateFactory, cụ thể (trong Oracle Java) một sun.security.provider.X509Factory. Nhà máy đó chỉ có các thành viên cá thể tĩnh mà [tôi đã kiểm tra] là các luồng an toàn. Nó cũng có một số phương thức synchronized static, cho biết lớp được xây dựng với sự an toàn của luồng.

Vì vậy, tôi muốn nói rằng trong thực tế, nếu bạn chắc chắn rằng bạn đang sử dụng Oracle Java (tm) thì bạn có thể giả định an toàn luồng; tuy nhiên, bạn sẽ cần phải kiểm tra các JRE khác nếu bạn đang sử dụng chúng. Bạn có thể luôn luôn chỉ được an toàn và quấn giá trị trong ThreadLocal, ví dụ:

private static final ThreadLocal<CertificateFactory> certFactory = 
    ThreadLocal.withInitial(() -> { 
    try { 
     return CertificateFactory.getInstance("x.509"); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
}); 

và sau đó

public Certificate loadCertFrom(String filename) throws IOException, CertificateException { 
    try (final FileInputStream in = new FileInputStream(filename)) { 
     return certFactory.get().generateCertificate(in); 
    } 
} 
Các vấn đề liên quan