String类型的值通常存储于常量池或JVM堆中。
字符串变量赋值时,赋值符右边:
1、只有字符串常量,那么变量存放在常量池里面。
2、new出来的字符串是存放在 堆里面。
3、对字符串进行拼接(+)操作时,分两种情况:
A、表达式右边是纯字符串常量,那么存放在常量池里面。
B、表达式右边如果存在字符串引用,那么就存放在JVM堆里面。
String a = "aaa"; // 常量池
String b = "bbb"; // 常量池
String c = a + b; // JVM堆
String d = "aaa" + "bbb"; // 常量池
String e = "aaabbb"; // 常量池
System.out.println(c == d); // false
System.out.println(d == e);// true
System.out.println(c.intern() == d); // true
通过上面理解,当对String加锁的时候,需要保证当前加锁的String是唯一的。
如果要对String加锁,最好是加锁String.intern()方法。
String.intern():判断该字符串是否存在常量池中,如果存在直接获取,不存在将当前字符串放到常量池中。
public class StringSync {
public static void main(String[] args) {
String param = "type";
String num = "1";
String token = param + num;
synchronized (token.intern()) {
// 执行同步方法
}
}
}