Java String#intern()的作用

发布时间 2023-04-20 09:37:11作者: Silentdoer

举个例子:

String aaa = "fff";
String bbb = new String("fff");
// 此时aaa和bbb的引用不同,但是值相同

//而synchronized(aaa)和synchronized(bbb)是不会产生互斥锁的,因为aaa和bbb此时不是同一个对象;

//如果此时执行:
aaa.intern();
// 那么aaa和bbb就是一个对象了(注意只是执行了aaa.intern()没有执行bbb.intern())
// 所以这个时候synchronized(aaa)和synchronized(bbb)是会产生互斥锁的

// 而如果接着又执行:
String ccc = new String("fff");
// 那么ccc和aaa、bbb的引用又是不一样的只是值一样;
// 所以intern()只对当前创建的相同内容的字符串全部有效(合并为一个对象),但是对之后的不会产生intern()效果

所以用字符串作为锁是可以的,但是要求每次都是synchronized(str.intern())来使用(假设是要求同一个字符串内容加同一个锁的话)

 

如果是通过get的方式则可以不需要,即Map<String, Object>,通过key来获取Object,Object是锁,只需要防止Map的Object不会覆盖即可;