org.apache.myfaces.util

Class BiLevelCacheMap

Implemented Interfaces:
Map

public abstract class BiLevelCacheMap
extends java.lang.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: 169655 $ $Date: 2005-05-11 18:45:06 +0200 (Wed, 11 May 2005) $
Author:
Anton Koinov (latest modification by $Author: grantsmith $)

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()

Field Details

_cacheL1

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

Constructor Details

BiLevelCacheMap

public BiLevelCacheMap(int mergeThreshold)

Method Details

clear

public void clear()

containsKey

public boolean containsKey(Object key)

containsValue

public boolean containsValue(Object value)

entrySet

public Set entrySet()

get

public Object get(Object key)

isEmpty

public boolean isEmpty()

keySet

public Set keySet()

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

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().

putAll

public void putAll(Map map)

remove

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

size

public int size()

values

public Collection values()