這是本文件的舊版!
Synchronized with String intern
Problem
下面程式碼是相當常見的lazy-instantiation。但在多執行緒存取時,會針對某一相同的key產生多個不同instance。也許最後在map中僅存著一份instance,但如果CreateCache動作耗時或有其它沒預料到的side-effect呢?
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); }最常見的做法是在method上增加synchronized,
public synchronized Object getCache(String key){ // ... }或在method內增加synchronized block,
public Object getCache(String key){ synchronized(mCacheMap){ // ... } }上面兩種方式,都屬於不管怎樣就是做同步的控管。但我們只需要針對key相同的情形做控管,才能獲得比較好的效能。