在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

}

 

 

 

 

 

 


 
                    
            
                

相关文章:

  • 2021-07-13
  • 2021-12-28
  • 2022-12-23
  • 2021-11-26
  • 2021-04-29
  • 2021-11-13
  • 2021-08-19
  • 2021-08-19
猜你喜欢
  • 2022-01-08
  • 2021-09-14
  • 2021-08-04
  • 2022-12-23
  • 2021-10-14
相关资源
相似解决方案