14
14
*/
15
15
package com .amazonaws .services .dynamodbv2 .datamodeling .internal ;
16
16
17
- import java .util .AbstractMap .SimpleImmutableEntry ;
17
+ import com .amazonaws .annotation .ThreadSafe ;
18
+
19
+ import java .util .ArrayList ;
18
20
import java .util .Collections ;
21
+ import java .util .Iterator ;
19
22
import java .util .LinkedHashMap ;
23
+ import java .util .List ;
20
24
import java .util .Map ;
21
- import java .util .Set ;
22
- import java .util .TreeSet ;
23
-
24
- import com .amazonaws .annotation .ThreadSafe ;
25
+ import java .util .Map .Entry ;
25
26
26
27
/**
27
28
* A bounded cache that has a LRU eviction policy when the cache is full.
@@ -98,11 +99,16 @@ public void clear() {
98
99
// The more complicated logic is to ensure that the listener is
99
100
// actually called for all entries.
100
101
if (listener != null ) {
101
- Set <String > keys = new TreeSet <String >(map .keySet ());
102
- for (String key : keys ) {
103
- T val = map .get (key );
104
- listener .onRemoval (new SimpleImmutableEntry <String , T >(key , val ));
105
- map .remove (key );
102
+ List <Entry <String , T >> removedEntries = new ArrayList <Entry <String , T >>();
103
+ synchronized (map ) {
104
+ Iterator <Entry <String , T >> it = map .entrySet ().iterator ();
105
+ while (it .hasNext ()) {
106
+ removedEntries .add (it .next ());
107
+ it .remove ();
108
+ }
109
+ }
110
+ for (Entry <String , T > entry : removedEntries ) {
111
+ listener .onRemoval (entry );
106
112
}
107
113
} else {
108
114
map .clear ();
@@ -126,7 +132,7 @@ private LRUHashMap(final int maxSize, final RemovalListener<T> listener) {
126
132
}
127
133
128
134
@ Override
129
- protected boolean removeEldestEntry (final Map . Entry <String , T > eldest ) {
135
+ protected boolean removeEldestEntry (final Entry <String , T > eldest ) {
130
136
if (size () > maxSize ) {
131
137
if (listener != null ) {
132
138
listener .onRemoval (eldest );
@@ -138,6 +144,6 @@ protected boolean removeEldestEntry(final Map.Entry<String, T> eldest) {
138
144
}
139
145
140
146
public static interface RemovalListener <T > {
141
- public void onRemoval (Map . Entry <String , T > entry );
147
+ public void onRemoval (Entry <String , T > entry );
142
148
}
143
149
}
0 commit comments