Thread.getId() глобальный вопрос уникальности
Если в системе работает несколько приложений Java, является ли каждый идентификатор потока уникальным по отношению ко всем другим потокам Java независимо от того, в каком приложении они работают?
Java-приложения должны быть помечены в виде песка по сравнению с другими Java-приложениями, поэтому я подумал, что возможно, чтобы конфликты Thread сталкивались.
Если идентификаторы потоков уникальны во всех приложениях, не будет ли утечка некоторой (хотя и очень незначительной) информации о других приложениях в системе? Например, сколько потоков было запущено в других приложениях или даже если другие приложения Java работают вообще?
Ответы
Ответ 1
Хорошо, позвольте мне проверить источник.
В методе Thread
init
(который вызывается каждым конструктором):
/* Set thread ID */
tid = nextThreadID();
В nextThreadID()
:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
и
/* For generating thread ID */
private static long threadSeqNumber;
Он никогда не устанавливается и, таким образом, по умолчанию 0.
Таким образом, очевидно, что идентификаторы потоков всегда начинаются с 0 и увеличиваются на 1. Другими словами, ответ на ваш вопрос заключается в том, что они не являются глобально уникальными.
Ответ 2
Согласно источнику JDK, идентификатор потока уникален в данной JVM - фактически, он просто реализуется как последовательность выполнения.
Здесь метод nextThreadID() из 1.6.0_10:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
(вероятно, на самом деле существует длинная ошибка переполнения, по-видимому, это никогда не происходило)