synchronized (string.intern())
Posted hahajava
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized (string.intern())相关的知识,希望对你有一定的参考价值。
在jdk7下慎用String.intern()作为synchronized的对象锁: https://www.cnblogs.com/yhlx/p/3498387.html
String.intern()在jdk7的变化后,我们为了在单例类里并发时对同一个用户保证操作原子性,会加同步块,例如:
synchronized (("" + userId).intern()) { // TODO:something }
这个在jdk6里问题不算大,因为String.intern()会在perm里产生空间,如果perm空间够用的话,这个不会导致频繁Full GC,
但是在jdk7里问题就大了,String.intern()会在heap里产生空间,而且还是老年代,如果对象一多就会导致Full GC时间超长!!!
慎用啊!解决办法?终于找到了。
这里要引用强大的google-guava包,这个包不是一般的强大,是完全要把apache-commons*取缔掉的节奏啊!!!
Interner<String> pool = Interners.newWeakInterner(); synchronized ( pool.intern("BizCode"+userId)){ //TODO:something }
以上是关于synchronized (string.intern())的主要内容,如果未能解决你的问题,请参考以下文章
多线程:synchronized代码块synchronized方法静态synchronized方法使用的锁