6

当我在 Java 中处理线程概念时,我看到了 Thread.java 源文件。我注意到当setName()方法将字符串分配给一个名为"name[]". Java具有String数据类型的特性,那么为什么它们使用字符数组。

在源文件中,它被初始化为,

private char name[]; // why not "private String name;"

setName()方法上,

public final void setName(String name) {
    checkAccess();
    this.name = name.toCharArray();
    }

请帮我。提前致谢。

4

2 回答 2

9

此名称是从本机代码访问的,因此处理 char 数组比处理 Java 类型更容易。邮件列表不久前讨论了这个core-lib-devs问题,这里是来自该线程的一封邮件的链接。最初的问题指出“相当多的时间用于 Thread.setName 调用,我认为其中很大一部分是进行新的字符分配和复制字符数组等”。引用部分答案:

早在 2002 年末就有一次这样的 RFE:

4745629(线程)Thread.setName 进行不必要的字符串分配(不要使用 char[])

2002 年的初步评估表明:

“我无法想象这会严重影响任何实际程序的性能。此外,由于此类与 VM 的密切关系,更改 Thread 中的字段是有问题的。也就是说,在上下文中解决这个问题可能是值得的一些线程代码清理。”

然后在 2005 年它被关闭为“不会修复”:

“名称表示在 JVM 中是一个 char 数组,因此必须尊重地拒绝这个 RFE。”

于 2012-05-02T11:03:18.030 回答
4

我认为这很可能是历史文物;即很久以前出于不再相关的原因而完成的事情。

正如 Curtisk 的评论所表明的,有人建议修复此问题。但听起来这些想法已经偏向一边,因为修复的努力超过了收益。很明显,修复这个异常的好处是微乎其微的……除非你创建了很多几乎没有实际工作的线程。

RFE (4745629) 不再对 Google 可见,但David Holmes @ Oracle发布的这个邮件列表引用了它:

卢晓斌在 08/11/10 08:07 说:

感谢您的回复。对于很多企业应用程序(比如我工作的那个),相当多的时间都花在了 Thread.setName 调用上,我相信其中很大一部分是进行新的字符分配和复制字符数组等。所以我认为我们应该重新考虑我们如何有效地存储该字段。

早在 2002 年末就有一次这样的 RFE:

4745629(线程)Thread.setName 进行不必要的字符串分配(不要使用 char[])

2002 年的初步评估表明:

“我无法想象这会严重影响任何实际程序的性能。此外,由于此类与 VM 的密切关系,更改 Thread 中的字段是有问题的。也就是说,在上下文中解决这个问题可能是值得的一些线程代码清理。”

然后在 2005 年它被关闭为“不会修复”:

“名称表示在 JVM 中是一个 char 数组,因此必须尊重地拒绝这个 RFE。”


如您所知,同时更改 VM 和 Java 代码确实很难协调,因此必须有一些令人信服的性能证据来支持这一点(假设可以更改)。就我个人而言,我同意上面的初始评估 - 如果 setName 正在影响你的整体性能,那么你的线程不能做太多的实际工作,而且你似乎创建了太多的线程 - 所以我有兴趣在这里更多地了解发生这种情况的上下文。

于 2012-05-02T11:22:15.760 回答