You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2005/11/21 17:10:41 UTC
svn commit: r345925 -
/directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java
Author: elecharny
Date: Mon Nov 21 08:10:37 2005
New Revision: 345925
URL: http://svn.apache.org/viewcvs?rev=345925&view=rev
Log:
Synchronized the HashMap to avoid problem on heavy loaded servers.
Modified:
directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java
Modified: directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java?rev=345925&r1=345924&r2=345925&view=diff
==============================================================================
--- directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java (original)
+++ directory/shared/ldap/trunk/common/src/main/java/org/apache/ldap/common/util/LRUMap.java Mon Nov 21 08:10:37 2005
@@ -58,7 +58,8 @@
* LRU limit of 100 keys, but this value may be overridden
* internally as a result of de-externalization.
*/
- public LRUMap() {
+ public LRUMap()
+ {
this( 100 );
}
@@ -69,7 +70,8 @@
*
* @param i Maximum capacity of the LRUMap
*/
- public LRUMap(int i) {
+ public LRUMap(int i)
+ {
super( i );
maximumSize = i;
}
@@ -86,11 +88,15 @@
* @return Returns the value. Returns null if the key has a
* null value <i>or</i> if the key has no value.
*/
- public Object get(Object key) {
- if(!containsKey(key)) return null;
-
- Object value = remove(key);
- super.put(key,value);
+ public synchronized Object get(Object key)
+ {
+ if(!containsKey(key))
+ {
+ return null;
+ }
+
+ Object value = remove(key);
+ super.put(key, value);
return value;
}
@@ -106,23 +112,32 @@
* @param value Object to add
* @return Former value of the key
*/
- public Object put( Object key, Object value ) {
+ public Object put( Object key, Object value )
+ {
int mapSize = size();
Object retval = null;
- if ( mapSize >= maximumSize ) {
+ if ( mapSize >= maximumSize )
+ {
+ synchronized (this)
+ {
+ // don't retire LRU if you are just
+ // updating an existing key
+ if (!containsKey(key))
+ {
+ // lets retire the least recently used item in the cache
+ removeLRU();
+ }
- // don't retire LRU if you are just
- // updating an existing key
- if (!containsKey(key)) {
- // lets retire the least recently used item in the cache
- removeLRU();
- }
+ retval = super.put(key,value);
+ }
}
-
- retval = super.put(key,value);
-
+ else
+ {
+ retval = super.put(key,value);
+ }
+
return retval;
}
@@ -130,15 +145,14 @@
* This method is used internally by the class for
* finding and removing the LRU Object.
*/
- protected void removeLRU() {
+ protected void removeLRU()
+ {
Object key = getFirstKey();
// be sure to call super.get(key), or you're likely to
// get infinite promotion recursion
- Object value = super.get(key);
+ super.get(key);
remove(key);
-
- processRemovedLRU(key,value);
}
/**
@@ -150,16 +164,19 @@
* @param key key that was removed
* @param value value of that key (can be null)
*/
- protected void processRemovedLRU(Object key, Object value) {
+ protected void processRemovedLRU(Object key, Object value)
+ {
}
// Externalizable interface
//-------------------------------------------------------------------------
- public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException {
+ public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
+ {
maximumSize = in.readInt();
int size = in.readInt();
- for( int i = 0; i < size; i++ ) {
+ for( int i = 0; i < size; i++ )
+ {
Object key = in.readObject();
Object value = in.readObject();
put(key,value);
@@ -169,7 +186,9 @@
public void writeExternal( ObjectOutput out ) throws IOException {
out.writeInt( maximumSize );
out.writeInt( size() );
- for( Iterator iterator = keySet().iterator(); iterator.hasNext(); ) {
+
+ for( Iterator iterator = keySet().iterator(); iterator.hasNext(); )
+ {
Object key = iterator.next();
out.writeObject( key );
// be sure to call super.get(key), or you're likely to
@@ -185,16 +204,24 @@
/** Getter for property maximumSize.
* @return Value of property maximumSize.
*/
- public int getMaximumSize() {
+ public int getMaximumSize()
+ {
return maximumSize;
}
+
/** Setter for property maximumSize.
* @param maximumSize New value of property maximumSize.
*/
- public void setMaximumSize(int maximumSize) {
- this.maximumSize = maximumSize;
- while (size() > maximumSize) {
- removeLRU();
+ public void setMaximumSize(int maximumSize)
+ {
+ synchronized (this)
+ {
+ this.maximumSize = maximumSize;
+
+ while (size() > maximumSize)
+ {
+ removeLRU();
+ }
}
}