在多线程应用程序中生成相同的UUID

时间:2015-07-11 21:04:04

标签: java multithreading uuid

我正在使用UUID.randomUUID()。toString()将一个唯一值附加到最终存储在数据库中并对其具有唯一约束的字符串

但是因为我的应用程序是多线程的,所以在UUID生成的同时执行并最终将相同的UUID附加到字符串并且持久性失败。

是否有更好的方法来生成随机字符串,即故障安全方法。

我试过调试,当我暂停其他线程并让它们一个接一个地运行时,它运行正常。

我目前正在使用以下代码使其更随机,但我不喜欢这种方法。

Random r = new Random();
List<Integer> uniqueNUmbers = new ArrayList<>();
for (int i=0;i<10;i++) {
int x=r.nextInt(9999);
while (uniqueNumbers.contains(x))
x=r.nextInt(9999);
uniqueNumbers.add(x);
} 
String string = String.format("%04d", uniqueNumbers.get(0));

string = uuid + string;

但这就像一个hacky代码。我不喜欢这个。

是否有人知道实际生成随机字符串的防故障方法。

3 个答案:

答案 0 :(得分:2)

你可以同步uuid-generation方法,和/或你可以preu uuid pool并在池开始耗尽时在一个线程中生成更多标识符。

答案 1 :(得分:1)

您可以尝试类似

int uuid = ThreadLocalRandom.current().nextInt());

答案 2 :(得分:0)

也许这个例子可以在将来帮助某人:

UUID uuid = UuidCreator.getRandomBased();

此库使用java.security.SecureRandom的线程本地实例:

https://github.com/f4b6a3/uuid-creator