Если все вызовы находятся в одной и той же JVM, я думаю, что все, что вам нужно, это создать статический объект для хранения последнего назначенного номера, написать одну функцию для увеличения номера и возврата нового значения, а затем выполнить синхронизацию поЭто.Например:
public class NumMaker
{
static long num=0;
public static synchronized next()
{
return ++num;
}
}
Если существует несколько JVM, проще всего сохранить номер в базе данных и использовать блокировку базы данных для сохранения уникальности номеров.
Обновление
Я вижу, вы добавили требование, чтобы числа были случайными.Если вы хотите, чтобы числа были случайными и уникальными, я не вижу альтернативы ведению списка всех ранее назначенных номеров.Вы можете хранить их в какой-то хэш-таблице, чтобы вам не приходилось каждый раз искать весь список.Если вы присваиваете много таких значений, размер хеш-таблицы может стать проблемой, даже если вам не нужно последовательно искать ее.
В зависимости от того, что вы пытаетесь выполнить,Вы могли бы придумать схему, которая присваивает числа не последовательно, а в жесткой последовательности, поэтому для некоторых целей они будут казаться случайными.Например, вы можете увеличить число на очень большое по отношению к максимуму и относительно простое с максимумом, а затем каждый раз, когда будет проходить следующий шаг, вычитать максимум.Например, чтобы уменьшить его, предположим, что вы назначали 2-значные числа вместо 9-значных.Увеличьте на 37. Затем вы назначите 37, 74, 111 оберток на 11, 48, 85, 122 оберток на 22 и т. Д.