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

15

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

Java应用程序应该相对于其他Java应用程序被隔离,因此我认为线程ID可能会发生冲突。

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


1
在提交代码之前,我应该先在Eclipse中使用F3查看方法的内容。 - Ben S
2个回答

25

好的,让我查看源代码。

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

/* 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开始递增。换句话说,回答你的问题是它们不是全局唯一的。


11
根据JDK源代码,线程ID在给定的JVM中是唯一的 - 实际上,它只是作为一个运行序列来实现。
以下是1.6.0_10版本的nextThreadID()方法:
private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}

(那里可能实际上存在一个长整型溢出漏洞,但假定它从未真正发生过)


是的,我认为现有的系统不太可能运行9223372036854775807个线程。 :) - Michael Myers
它不必同时运行它们……假设有一个系统,每秒钟创建一个新线程(显然应该是线程池,但假设它不是)。那只是连续运行292471208677年 :P。 - Jared
每毫秒生成一个新线程需要292277.266个千年才能溢出。 - Ben S
8
你是在暗示JVM不足以经受292,277个千年的时间吗?:P - Jared
当创建了许多线程时,从0重新开始计数可能被认为是可以接受的! - matt b
但它不会再从0开始计数(除非重新启动JVM)...没有if(counter == Integer.MAX_VALUE)检查。 - Jared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接