如果多个 Java 应用程序在一个系统上运行,那么每个线程 ID 是否相对于所有其他 Java 线程是唯一的,无论它们在哪个应用程序中运行?
Java 应用程序相对于其他 Java 应用程序应该是沙盒的,所以我认为线程 ID 可能会发生冲突。
如果线程 ID 在所有应用程序中都是唯一的,那不会泄露一些(尽管非常少)有关系统上其他应用程序的信息吗?例如在其他应用程序中启动了多少线程,或者即使其他 Java 应用程序正在运行?
如果多个 Java 应用程序在一个系统上运行,那么每个线程 ID 是否相对于所有其他 Java 线程是唯一的,无论它们在哪个应用程序中运行?
Java 应用程序相对于其他 Java 应用程序应该是沙盒的,所以我认为线程 ID 可能会发生冲突。
如果线程 ID 在所有应用程序中都是唯一的,那不会泄露一些(尽管非常少)有关系统上其他应用程序的信息吗?例如在其他应用程序中启动了多少线程,或者即使其他 Java 应用程序正在运行?
好吧,让我检查一下来源。
在Thread
'sinit
方法中(由每个构造函数调用):
/* Set thread ID */
tid = nextThreadID();
在nextThreadID()
:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
和:
/* For generating thread ID */
private static long threadSeqNumber;
threadSeqNumber
初始化为 0(默认long
值),因此返回的第一个值nextThreadID
是 1。
因此,线程 ID 编号始终从 1 开始并以 1 递增。换句话说,您的问题的答案是它们不是全局唯一的。
根据 JDK 源,线程 ID 在给定的 JVM 中是唯一的 - 实际上,它只是作为运行序列实现的。
这是 1.6.0_10 中的 nextThreadID() 方法:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
(实际上可能有一个很长的溢出错误,大概它从未真正发生过)