1. 程式人生 > >synchronized (string.intern())

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

}