【问题标题】:Thread.getId() global uniqueness questionThread.getId() 全局唯一性问题
【发布时间】:2010-10-10 03:35:06
【问题描述】:

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

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

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

【问题讨论】:

  • 在发布之前我可能应该 F3 进入 Eclipse 中的方法...

标签: java multithreading uniqueidentifier


【解决方案1】:

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

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 开始并以 1 递增。换句话说,您的问题的答案是它们是全局唯一的。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 是的,我认为任何现有系统都不太可能运行 9223372036854775807 线程。 :)
    • 它不必同时运行它们......假设有一个系统每秒创建一个新线程(显然它应该是线程池,但假设不是。)那只是292471208677年连续运行:P
    • 每毫秒生成一个新线程需要 292 277.266 千年才能溢出。
    • 您是在暗示 JVM 不够健壮,无法生存 292,277 千年吗? :P
    • 等到创建了很多线程的时候,再从0开始计数大概就OK了!
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2011-02-17
    相关资源
    最近更新 更多