关于锁不住toString()后的字符串的问题
关于锁不住toString()后的字符串的问题
原因:toString()的源码如下所示,最终都是生成新的字符串,所以当多线程调用的时候,每个线程锁的并不是同一对象。
public static String toString(long i) {
int size = stringSize(i);
if (COMPACT_STRINGS) {
byte[] buf = new byte[size];
getChars(i, size, buf);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[size * 2];
StringUTF16.getChars(i, size, buf);
return new String(buf, UTF16);
}
}
解决方法:使用String类的intern()方法,例如:
synchronized (a.toString().intern()) {
···
}
intern()其会返回字符串常量池中和字符串a相同内容的字符串,即字符串a,锁的一直是同一个字符串。