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代码块synchronized方法静态synchronized方法使用的锁

static synchronized与synchronized

Synchronized原理

synchronized的锁优化是怎么处理的?