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

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

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

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

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

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

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

nextThreadID()

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

和:

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

它永远不会设置,因此默认为0。

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

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

这是1.6.0_10中的nextThreadID()方法:

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

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