Thread.getId() 全局唯一性问题

2022-09-03 17:56:23

如果多个 Java 应用程序在一个系统上运行,那么每个线程 ID 相对于所有其他 Java 线程是否是唯一的,无论它们在哪个应用程序中运行?

相对于其他Java应用程序,Java应用程序应该是沙盒的,所以我认为线程ID可能会发生冲突。

如果线程 ID 在所有应用程序中都是唯一的,那么这是否会泄漏有关系统上其他应用程序的一些(尽管非常小)信息?例如,在其他应用程序中启动了多少个线程,或者即使其他Java应用程序正在运行?


答案 1

好吧,让我检查一下来源。

在 的方法中(由每个构造函数调用):Threadinit

/* Set thread ID */
tid = nextThreadID();

在:nextThreadID()

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

和:

/* For generating thread ID */
private static long threadSeqNumber;

threadSeqNumber初始化为 0(默认值),因此 返回的第一个值为 1。longnextThreadID

因此,线程 ID 号始终从 1 开始,并按 1 递增。换句话说,你的问题的答案是它们不是全局唯一的。


答案 2

根据 JDK 源代码,线程 ID 在给定的 JVM 中是唯一的 - 实际上,它只是作为运行序列实现。

下面是来自 1.6.0_10 的下一个ThreadID() 方法:

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

(那里可能实际上有一个很长的溢出错误,大概它从未真正发生过)