众所周知,synchronized 同步锁,是通过引用来锁的,那么通过锁字符串的时候,就可能有问题,就是不知道外常传的String字符串是否为同一个引用。例如,一个webController接收的相同字符串,他的引用地址就不一样。
那么可不可以通过 String.intern()的方法,获取常量池对象,使得对象地址相同呢。一般情况是可以的,但是有些情况也不行
例如当发生gc时,有时会有问题
String prefix = "hehe"; System.out.println(System.identityHashCode((prefix+x).intern()));
System.gc();
经测试,上面的情况,每次地址都不同。
通过查询可知,prefix + x 底层是自动new StringBuilder 拼接字符串在toString()的
但是不了解的是,如果 代码改成
System.out.println(System.identityHashCode(x.intern())); System.gc();
虽然x的原始地址不同,x.intern()后地址相同,但是gc后,下次访问 x.intern()的地址还是相同,也就是说,常量池中的x并没有并回收
标签:prefix,同步,String,System,intern,gc,测试,地址 From: https://www.cnblogs.com/jaxlove-it/p/16704327.html