Thread.getId () вопрос глобальной уникальности

Если в системе работает несколько приложений Java, является ли каждый идентификатор потока уникальным по сравнению со всеми другими потоками Java, независимо от того, в каком приложении они работают?

Приложения Java должны быть изолированы от других приложений Java, поэтому я подумал, что идентификаторы потоков могут конфликтовать.

Если идентификаторы потоков уникальны для всех приложений, не приведет ли это к утечке некоторой (хотя и очень незначительной) информации о других приложениях в системе? Например, сколько потоков запущено в других приложениях, или даже если другие приложения Java вообще выполняются?

Ответов (2)

Решение

Что ж, позвольте мне проверить источник.

В Thread «S 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. Другими словами, ответ на ваш вопрос заключается в том, что они не являются глобально уникальными.

Согласно источнику JDK, идентификатор потока уникален в данной JVM - фактически, он просто реализован как выполняющаяся последовательность.

Вот метод nextThreadID () из 1.6.0_10:

private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}

(там, вероятно, на самом деле есть долгая ошибка переполнения, по-видимому, на самом деле этого никогда не было)