首页 > 其他分享 >String作为同步锁测试

String作为同步锁测试

时间:2022-09-18 10:34:21浏览次数:75  
标签:prefix 同步 String System intern gc 测试 地址

众所周知,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

相关文章