Thread.getId () глобальный вопрос уникальности - PullRequest
11 голосов
/ 26 февраля 2009

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

Java-приложения должны быть помещены в «песочницу» по сравнению с другими Java-приложениями, поэтому я подумал, что для идентификаторов потоков может возникнуть коллизия.

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

Ответы [ 2 ]

23 голосов
/ 26 февраля 2009

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

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

7 голосов
/ 26 февраля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...