synchronized (string.intern())
阿新 • • 發佈:2018-11-19
在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 }