如果系统上正在运行多个Java应用程序,则每个线程标识是否相对于所有其他Java线程都是唯一的,而不管它们在哪个应用程序中运行?Thread.getId()全局唯一性问题
相对于其他Java应用程序,Java应用程序应该是沙盒式的,所以我认为线程ID可能会发生冲突。
如果线程ID在所有应用程序中都是唯一的,那么会不会泄露有关系统上其他应用程序的一些(尽管很小)信息?比如在其他应用程序中启动了多少个线程,或者即使其他Java应用程序正在运行?
如果系统上正在运行多个Java应用程序,则每个线程标识是否相对于所有其他Java线程都是唯一的,而不管它们在哪个应用程序中运行?Thread.getId()全局唯一性问题
相对于其他Java应用程序,Java应用程序应该是沙盒式的,所以我认为线程ID可能会发生冲突。
如果线程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;
这是从来没有设置,因此默认为0.
因此,显然线程ID号码总是从0开始并递增1.换句话说,您的问题的答案是他们是而不是全局唯一。
根据JDK源代码,线程ID在给定的JVM中是唯一的 - 事实上,它只是作为一个运行序列来实现。
下面是1.6.0_10的nextThreadID()方法:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
(有可能实际上是在那里长期溢出错误,想必它实际上从未发生过)
是的,我认为任何现有系统都不可能运行9223372036854775807线程。 :) – 2009-02-26 17:53:26
我也许应该F3到Eclipse中的方法在发布之前... – 2009-02-26 18:01:43