Loading

关于锁不住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,锁的一直是同一个字符串。

posted @ 2022-06-01 22:36  KeepGoing4everZxz  阅读(50)  评论(0编辑  收藏  举报