org.apache.myfaces.shared_orchestra.util
Class BiLevelCacheMap

java.lang.Object
  extended by org.apache.myfaces.shared_orchestra.util.BiLevelCacheMap
All Implemented Interfaces:
Map

public abstract class BiLevelCacheMap
extends Object
implements Map

A bi-level cache based on HashMap for caching objects with minimal sychronization overhead. The limitation is that remove() is very expensive.

Access to L1 map is not sychronized, to L2 map is synchronized. New values are first stored in L2. Once there have been more that a specified mumber of misses on L1, L1 and L2 maps are merged and the new map assigned to L1 and L2 cleared.

IMPORTANT:entrySet(), keySet(), and values() return unmodifiable snapshot collections.

Version:
$Revision: 472630 $ $Date: 2006-11-08 15:40:03 -0500 (Wed, 08 Nov 2006) $
Author:
Anton Koinov (latest modification by $Author: grantsmith $)

Nested Class Summary
 
Nested classes/interfaces inherited from interface java.util.Map
Map.Entry<K,V>
 
Field Summary
protected  Map _cacheL1
          To preinitialize _cacheL1 with default values use an initialization block
 
Constructor Summary
BiLevelCacheMap(int mergeThreshold)
           
 
Method Summary
 void clear()
           
 boolean containsKey(Object key)
           
 boolean containsValue(Object value)
           
 Set entrySet()
           
 Object get(Object key)
           
 boolean isEmpty()
           
 Set keySet()
           
protected abstract  Object newInstance(Object key)
          Subclasses must implement to have automatic creation of new instances or alternatively can use put to add new items to the cache.
Implementing this method is prefered to guarantee that there will be only one instance per key ever created.
 Object put(Object key, Object value)
          If key is already in cacheL1, the new value will show with a delay, since merge L2->L1 may not happen immediately.
 void putAll(Map map)
           
 Object remove(Object key)
          This operation is very expensive.
 int size()
           
 Collection values()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface java.util.Map
equals, hashCode
 

Field Detail

_cacheL1

protected Map _cacheL1
To preinitialize _cacheL1 with default values use an initialization block

Constructor Detail

BiLevelCacheMap

public BiLevelCacheMap(int mergeThreshold)
Method Detail

isEmpty

public boolean isEmpty()
Specified by:
isEmpty in interface Map

clear

public void clear()
Specified by:
clear in interface Map

containsKey

public boolean containsKey(Object key)
Specified by:
containsKey in interface Map

containsValue

public boolean containsValue(Object value)
Specified by:
containsValue in interface Map

entrySet

public Set entrySet()
Specified by:
entrySet in interface Map

get

public Object get(Object key)
Specified by:
get in interface Map

keySet

public Set keySet()
Specified by:
keySet in interface Map

put

public Object put(Object key,
                  Object value)
If key is already in cacheL1, the new value will show with a delay, since merge L2->L1 may not happen immediately. To force the merge sooner, call size().

Specified by:
put in interface Map

putAll

public void putAll(Map map)
Specified by:
putAll in interface Map

remove

public Object remove(Object key)
This operation is very expensive. A full copy of the Map is created

Specified by:
remove in interface Map

size

public int size()
Specified by:
size in interface Map

values

public Collection values()
Specified by:
values in interface Map

newInstance

protected abstract Object newInstance(Object key)
Subclasses must implement to have automatic creation of new instances or alternatively can use put to add new items to the cache.
Implementing this method is prefered to guarantee that there will be only one instance per key ever created. Calling put() to add items in a multi- threaded situation will require external synchronization to prevent two instances for the same key, which defeats the purpose of this cache (put() is useful when initialization is done during startup and items are not added during execution or when (temporarily) having possibly two or more instances of the same key is not of concern).

Parameters:
key - lookup key
Returns:
new instace for the requested key


Copyright © 2012 The Apache Software Foundation. All Rights Reserved.