2009-02-26 203 views
10

如果系统上正在运行多个Java应用程序,则每个线程标识是否相对于所有其他Java线程都是唯一的,而不管它们在哪个应用程序中运行?Thread.getId()全局唯一性问题

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

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

+1

我也许应该F3到Eclipse中的方法在发布之前... – 2009-02-26 18:01:43

回答

21

好吧,让我检查来源。

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.换句话说,您的问题的答案是他们是而不是全局唯一。

7

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

下面是1.6.0_10的nextThreadID()方法:

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

(有可能实际上是在那里长期溢出错误,想必它实际上从未发生过)

+0

是的,我认为任何现有系统都不可能运行9223372036854775807线程。 :) – 2009-02-26 17:53:26