如果在系统上运行多个Java应用程序,那么每个线程ID是否相对于所有其他Java线程都是唯一的,而不管它们正在运行哪个应用程序?
Java应用程序应该相对于其他Java应用程序被隔离,因此我认为线程ID可能会发生冲突。
如果Thread ID在所有应用程序中都是唯一的,那么这是否会泄漏有关系统上其他应用程序的一些(尽管非常微小的)信息?例如,在其他应用程序中启动了多少线程,甚至是否在运行其他Java应用程序?
如果在系统上运行多个Java应用程序,那么每个线程ID是否相对于所有其他Java线程都是唯一的,而不管它们正在运行哪个应用程序?
Java应用程序应该相对于其他Java应用程序被隔离,因此我认为线程ID可能会发生冲突。
如果Thread ID在所有应用程序中都是唯一的,那么这是否会泄漏有关系统上其他应用程序的一些(尽管非常微小的)信息?例如,在其他应用程序中启动了多少线程,甚至是否在运行其他Java应用程序?
好的,让我查看源代码。
在每个构造函数中调用的Thread
的init
方法中:
/* 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开始递增。换句话说,回答你的问题是它们不是全局唯一的。
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
(那里可能实际上存在一个长整型溢出漏洞,但假定它从未真正发生过)