gpt4 book ai didi

java - 为什么 Java 在 StringBuilder 更快时使用 StringBuffer(同步)?

转载 作者:行者123 更新时间:2023-11-29 09:49:33 25 4
gpt4 key购买 nike

我在查看 Java 反射类时注意到了这段代码。让我想知道,为什么 Java 在 StringBuilder 更快时使用 StringBuffer?

Java 不想使用最快的实现,还是有其他原因?

代码在Field.class中:

static String getTypeName(Class<?> type) {
if (type.isArray()) {
try {
Class<?> cl = type;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
cl = cl.getComponentType();
}
StringBuffer sb = new StringBuffer();
sb.append(cl.getName());
for (int i = 0; i < dimensions; i++) {
sb.append("[]");
}
return sb.toString();
} catch (Throwable e) { /*FALLTHRU*/ }
}
return type.getName();
}

最佳答案

主要原因是 JVM 具有先进的技术,可以查看是否可以避免执行上下文暗示的各种事情。由于 StringBuffer 是一个永远不会逃脱该方法的局部变量,因此 JVM 可以安全地避免在进入 StringBuffer 的同步方法之前尝试并获取对象上的锁——因为没有其他线程能够调用这个特定方法的方法StringBuffer 的实例。

快速微基准测试证实了这一点。使 buffer 成为一个字段将使以下代码的速度降低 50%。

private void doTest(String toCopy) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < toCopy.length(); i++) {
buffer.append(toCopy.charAt(i));
}
buffer.toString();
}

对于一百万长度的字符串和 1000 次重复,上面的代码在我的机器上运行 8 秒。然而,一旦 buffer 被制成一个字段而不是一个局部变量,那么大约需要 13 秒(因为 JVM 不能再轻易保证 buffer 只能被访问一个线程)。

关于java - 为什么 Java 在 StringBuilder 更快时使用 StringBuffer(同步)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com