public class Log {
private static StringBuilder log = new StringBuilder();
private static StringBuilder getLog() {
return log;
}
public static void addToLog(String id, String name, String field, String operator, String value, String bValue) {
Calendar calendar = Calendar.getInstance();
String currentTime = formatter.format(calendar.getTime());
getLog().append(currentTime); // line 114
}
}堆栈跟踪:
[java] Exception in thread "Thread-5" java.lang.ArrayIndexOutOfBoundsException
[java] at java.lang.String.getChars(String.java:863)
[java] at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416)
[java] at java.lang.StringBuilder.append(StringBuilder.java:132)
[java] at com.retroficiency.system.Log.addToMatchingLog(Log.java:114)这种方法通常工作得很好,但我们遇到了这个随机错误,我不知道为什么。有一个单独的方法,它将日志刷新到一个文件中,并使用以下命令清除它:
getLog().delete(0, getMatchingLog().length());我不认为这是一个Java bug?是不是太长了?谢谢你的帮助!
发布于 2012-10-12 01:55:38
StringBuilder不是线程安全的。在这种情况下,您应该使用StringBuffer。
你可以在另一个SO线程中找到更多信息:
发布于 2012-10-12 01:56:05
没有理由会发生这种情况,除非您从不同的线程访问此方法:StringBuilder不是线程安全的。您可以使用StringBuffer,它是线程安全的,或者添加某种形式的同步。
Javadoc
多线程使用StringBuilder的
实例是不安全的。如果需要这样的同步,则建议使用StringBuffer。
https://stackoverflow.com/questions/12845634
复制相似问题