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

}

 

 

 

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM