Implementasi saat ini SecureRandom
adalah thread safe, khususnya dua metode mutasi nextBytes(bytes[])
dan setSeed(byte[])
disinkronkan.
Sejauh yang saya tahu, semua metode mutasi pada akhirnya diarahkan melalui kedua metode tersebut, dan SecureRandom
menimpa beberapa metode Random
untuk memastikannya. Yang berfungsi tetapi bisa rapuh jika penerapannya diubah di masa mendatang.
Solusi terbaik adalah menyinkronkan SecureRandom
instans secara manual terlebih dahulu. Ini berarti setiap tumpukan panggilan akan memperoleh dua kunci pada objek yang sama, tetapi biasanya sangat murah pada JVM modern. Artinya, tidak banyak salahnya menyinkronkan diri Anda secara eksplisit. Sebagai contoh:
SecureRandom rnd = ...;
byte[] b = new byte[NRANDOM_BYTES];
synchronized (rnd) {
rnd.nextBytes(b);
}