在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 }
