1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.common.lru;
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26
27
28
29
30
31
32
33
34
35
36 public class SynchronizedLruCache<K, V> extends AbstractLruCache<K, V> {
37 private static final int DEFAULT_INITIAL_CAPACITY = 16;
38
39 private static final float DEFAULT_LOAD_FACTOR = 0.75f;
40
41 private final CapacityLruLinkedHashMap<K, InterfaceLruCacheEntry<V>> cacheMap;
42
43
44
45
46
47
48
49
50
51 public SynchronizedLruCache(final int capacity, final long ttl,
52 final int initialCapacity,
53 final float loadFactor) {
54 super(ttl);
55 cacheMap =
56 new CapacityLruLinkedHashMap<K, InterfaceLruCacheEntry<V>>(capacity,
57 initialCapacity,
58 loadFactor);
59 }
60
61
62
63
64
65
66
67
68 public SynchronizedLruCache(final int capacity, final long ttl,
69 final int initialCapacity) {
70 this(capacity, ttl, initialCapacity, DEFAULT_LOAD_FACTOR);
71 }
72
73
74
75
76
77
78
79
80 public SynchronizedLruCache(final int capacity, final long ttl) {
81 this(capacity, ttl, DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR);
82 }
83
84 @Override
85 public synchronized void clear() {
86 cacheMap.clear();
87 }
88
89 @Override
90 public synchronized V get(final K key) {
91 return super.get(key);
92 }
93
94 @Override
95 public final int getCapacity() {
96 return cacheMap.getCapacity();
97 }
98
99 @Override
100 protected final InterfaceLruCacheEntry<V> getEntry(final K key) {
101 return cacheMap.get(key);
102 }
103
104 @Override
105 public synchronized int size() {
106 return cacheMap.size();
107 }
108
109 @Override
110 public synchronized void put(final K key, final V value, final long ttl) {
111 super.put(key, value, ttl);
112 }
113
114 @Override
115 protected final void putEntry(final K key,
116 final InterfaceLruCacheEntry<V> entry) {
117 cacheMap.put(key, entry);
118 }
119
120 @Override
121 public synchronized V remove(final K key) {
122 final InterfaceLruCacheEntry<V> cv = cacheMap.remove(key);
123 if (cv != null) {
124 return cv.getValue();
125 }
126 return null;
127 }
128
129 @Override
130 public final Collection<V> values() {
131 final Collection<InterfaceLruCacheEntry<V>> cacheEntry = cacheMap.values();
132 final List<V> list = new ArrayList<V>(cacheEntry.size());
133 for (final InterfaceLruCacheEntry<V> entry : cacheEntry) {
134 list.add(entry.getValue());
135 }
136 return list;
137 }
138
139 @Override
140 public synchronized int forceClearOldest() {
141 final long timeRef = System.currentTimeMillis();
142 final Collection<InterfaceLruCacheEntry<V>> collection = cacheMap.values();
143 final Iterator<InterfaceLruCacheEntry<V>> iterator = collection.iterator();
144 int nb = 0;
145 while (iterator.hasNext()) {
146 final InterfaceLruCacheEntry<V> v = iterator.next();
147 if (!v.isStillValid(timeRef)) {
148 iterator.remove();
149 nb++;
150 }
151 }
152 return nb;
153 }
154
155 }