差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

java:basic:string_intern [2015/04/27 18:23]
tony [How to?]
java:basic:string_intern [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​java}} 
-====== Synchronized with String intern ====== 
-===== Problem ===== 
-下面程式碼是相當常見的lazy-instantiation。但在多執行緒存取時,會針對某一相同的key產生多個不同instance。也許最後在map中僅存著一份instance,但如果CreateCache動作耗時或有其它沒預料到的side-effect呢?​ 
-<code java> 
-private volatile Map<​String,​ Object> mCacheMap= new ConcurrentHashMap<​String,​ Object>​();​ 
  
-public Object getCache(String key){ 
- if(!mCacheMap.contains(key)){ 
- mCacheMap.put(key,​ createCache(key));​ 
- } 
- return mCacheMap.get(key);​ 
-} 
-</​code>​ 
-最常見的做法是在method上增加synchronized, 
-<code java> 
-public synchronized ​ Object getCache(String key){ 
-  // ... 
-} 
-</​code>​ 
-或在method內增加synchronized block, 
-<code java> 
-public Object getCache(String key){ 
- synchronized(mCacheMap){ 
- // ... 
- } 
-} 
-</​code>​ 
-上面兩種方式,都屬於不管怎樣就是做同步的控管。但我們只需要針對key相同的情形做控管,才能獲得比較好的效能。 
-===== How to? ===== 
-所以我們"​也許"​可以寫成這樣:​ 
-<code java> 
-public Object getCache(String key){ 
- synchronized(key.intern()){ 
- // ... 
- } 
-} 
-</​code>​ 
-但對沒使用過的東西,我無法放100萬個心下來,所以稍微google了這method的資訊。赫然發現,許多的人都不推使用String intern()。觀看intern裡面的實做,最後會呼叫到JVM的native code,因此這實做是綁在JVM上的。 
-===== Reference ===== 
-  * [[http://​www.javaworld.com/​article/​2077568/​learn-java/​java-tip-67--lazy-instantiation.html|lazy-instantiation]]