Việc triển khai hiện tại SecureRandomlà an toàn theo luồng, đặc biệt là hai phương pháp đột biến nextBytes(bytes[])và setSeed(byte[])được đồng bộ hóa.
Chà, theo như tôi có thể nói, tất cả các phương thức đột biến cuối cùng đều được định tuyến thông qua hai phương thức đó và SecureRandomghi đè một vài phương thức Randomđể đảm bảo điều đó. Phương pháp này hoạt động nhưng có thể bị hỏng nếu việc triển khai bị thay đổi trong tương lai.
Giải pháp tốt nhất là đồng bộ hóa thủ công trên SecureRandomphiên bản đầu tiên. Điều này có nghĩa là mỗi ngăn xếp cuộc gọi sẽ thu được hai khóa trên cùng một đối tượng, nhưng điều đó thường rất rẻ trên các JVM hiện đại. Có nghĩa là, không có nhiều tác hại trong việc đồng bộ hóa rõ ràng bản thân. Ví dụ:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}