我最近偶然发现了一个我无法解释的错误:
线程处于[WAITING]
状态,而char buf[] = new char[count + otherLen];
内似乎正在执行java.lang.String.concat(String.java:2021)
。
这是堆栈跟踪:
"WORKER3"/[WAITING]
java.lang.String.concat(String.java:2021)
java.net.URLClassLoader$1.run(URLClassLoader.java:357)
java.net.URLClassLoader$1.run(URLClassLoader.java:355)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:354)
java.lang.ClassLoader.loadClass(ClassLoader.java:423)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
java.lang.ClassLoader.loadClass(ClassLoader.java:356)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:186)
[...]
现在,从Oracle JDK7文档中我们可以看到WAITING
状态的线程是:
等待线程的线程状态。线程处于等待状态 由于调用以下方法之一:
Object.wait with no timeout Thread.join with no timeout LockSupport.park
但是String.concat
的源代码似乎没有使用任何一个:
2016 public String concat(String str) {
2017 int otherLen = str.length();
2018 if (otherLen == 0) {
2019 return this;
2020 }
2021 char buf[] = new char[count + otherLen];
2022 getChars(0, count, buf, 0);
2023 str.getChars(0, otherLen, buf, count);
2024 return new String(0, count + otherLen, buf);
2025 }
我觉得这可能与垃圾收集有关,但我找不到任何相关的证据。
有人能说清楚吗?