• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.cache;
18 
19 import static com.google.common.base.Objects.firstNonNull;
20 import static com.google.common.base.Preconditions.checkArgument;
21 import static com.google.common.base.Preconditions.checkNotNull;
22 import static com.google.common.base.Preconditions.checkState;
23 
24 import com.google.common.annotations.Beta;
25 import com.google.common.annotations.GwtCompatible;
26 import com.google.common.annotations.GwtIncompatible;
27 import com.google.common.base.Ascii;
28 import com.google.common.base.Equivalence;
29 import com.google.common.base.Equivalences;
30 import com.google.common.base.Objects;
31 import com.google.common.base.Supplier;
32 import com.google.common.base.Suppliers;
33 import com.google.common.base.Ticker;
34 import com.google.common.cache.AbstractCache.SimpleStatsCounter;
35 import com.google.common.cache.AbstractCache.StatsCounter;
36 import com.google.common.cache.LocalCache.Strength;
37 
38 import java.lang.ref.SoftReference;
39 import java.lang.ref.WeakReference;
40 import java.util.ConcurrentModificationException;
41 import java.util.concurrent.ConcurrentHashMap;
42 import java.util.concurrent.TimeUnit;
43 import java.util.logging.Level;
44 import java.util.logging.Logger;
45 
46 import javax.annotation.CheckReturnValue;
47 
48 /**
49  * <p>A builder of {@link LoadingCache} and {@link Cache} instances having any combination of the
50  * following features:
51  *
52  * <ul>
53  * <li>automatic loading of entries into the cache
54  * <li>least-recently-used eviction when a maximum size is exceeded
55  * <li>time-based expiration of entries, measured since last access or last write
56  * <li>keys automatically wrapped in {@linkplain WeakReference weak} references
57  * <li>values automatically wrapped in {@linkplain WeakReference weak} or
58  *     {@linkplain SoftReference soft} references
59  * <li>notification of evicted (or otherwise removed) entries
60  * </ul>
61  *
62  * <p>Usage example: <pre>   {@code
63  *
64  *   LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
65  *       .maximumSize(10000)
66  *       .expireAfterWrite(10, TimeUnit.MINUTES)
67  *       .removalListener(MY_LISTENER)
68  *       .build(
69  *           new CacheLoader<Key, Graph>() {
70  *             public Graph load(Key key) throws AnyException {
71  *               return createExpensiveGraph(key);
72  *             }
73  *           });}</pre>
74  *
75  *
76  * These features are all optional.
77  *
78  * <p>The returned cache is implemented as a hash table with similar performance characteristics to
79  * {@link ConcurrentHashMap}. It implements all optional operations of the {@link LoadingCache} and
80  * {@link Cache} interfaces. The {@code asMap} view (and its collection views) have <i>weakly
81  * consistent iterators</i>. This means that they are safe for concurrent use, but if other threads
82  * modify the cache after the iterator is created, it is undefined which of these changes, if any,
83  * are reflected in that iterator. These iterators never throw {@link
84  * ConcurrentModificationException}.
85  *
86  * <p><b>Note:</b> by default, the returned cache uses equality comparisons (the
87  * {@link Object#equals equals} method) to determine equality for keys or values. However, if
88  * {@link #weakKeys} was specified, the cache uses identity ({@code ==})
89  * comparisons instead for keys. Likewise, if {@link #weakValues} or {@link #softValues} was
90  * specified, the cache uses identity comparisons for values.
91  *
92  * <p>Entries are automatically evicted from the cache when any of
93  * {@linkplain #maximumSize(long) maximumSize}, {@linkplain #maximumWeight(long) maximumWeight},
94  * {@linkplain #expireAfterWrite expireAfterWrite},
95  * {@linkplain #expireAfterAccess expireAfterAccess}, {@linkplain #weakKeys weakKeys},
96  * {@linkplain #weakValues weakValues}, or {@linkplain #softValues softValues} are requested.
97  *
98  * <p>If {@linkplain #maximumSize(long) maximumSize} or
99  * {@linkplain #maximumWeight(long) maximumWeight} is requested entries may be evicted on each cache
100  * modification.
101  *
102  * <p>If {@linkplain #expireAfterWrite expireAfterWrite} or
103  * {@linkplain #expireAfterAccess expireAfterAccess} is requested entries may be evicted on each
104  * cache modification, on occasional cache accesses, or on calls to {@link Cache#cleanUp}. Expired
105  * entries may be counted in {@link Cache#size}, but will never be visible to read or write
106  * operations.
107  *
108  * <p>If {@linkplain #weakKeys weakKeys}, {@linkplain #weakValues weakValues}, or
109  * {@linkplain #softValues softValues} are requested, it is possible for a key or value present in
110  * the cache to be reclaimed by the garbage collector. Entries with reclaimed keys or values may be
111  * removed from the cache on each cache modification, on occasional cache accesses, or on calls to
112  * {@link Cache#cleanUp}; such entries may be counted in {@link Cache#size}, but will never be
113  * visible to read or write operations.
114  *
115  * <p>Certain cache configurations will result in the accrual of periodic maintenance tasks which
116  * will be performed during write operations, or during occasional read operations in the absense of
117  * writes. The {@link Cache#cleanUp} method of the returned cache will also perform maintenance, but
118  * calling it should not be necessary with a high throughput cache. Only caches built with
119  * {@linkplain #removalListener removalListener}, {@linkplain #expireAfterWrite expireAfterWrite},
120  * {@linkplain #expireAfterAccess expireAfterAccess}, {@linkplain #weakKeys weakKeys},
121  * {@linkplain #weakValues weakValues}, or {@linkplain #softValues softValues} perform periodic
122  * maintenance.
123  *
124  * <p>The caches produced by {@code CacheBuilder} are serializable, and the deserialized caches
125  * retain all the configuration properties of the original cache. Note that the serialized form does
126  * <i>not</i> include cache contents, but only configuration.
127  *
128  * @param <K> the base key type for all caches created by this builder
129  * @param <V> the base value type for all caches created by this builder
130  * @author Charles Fry
131  * @author Kevin Bourrillion
132  * @since 10.0
133  */
134 @Beta
135 @GwtCompatible(emulated = true)
136 public final class CacheBuilder<K, V> {
137   private static final int DEFAULT_INITIAL_CAPACITY = 16;
138   private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
139   private static final int DEFAULT_EXPIRATION_NANOS = 0;
140   private static final int DEFAULT_REFRESH_NANOS = 0;
141 
142   static final Supplier<? extends StatsCounter> NULL_STATS_COUNTER = Suppliers.ofInstance(
143       new StatsCounter() {
144         @Override
145         public void recordHits(int count) {}
146 
147         @Override
148         public void recordMisses(int count) {}
149 
150         @Override
151         public void recordLoadSuccess(long loadTime) {}
152 
153         @Override
154         public void recordLoadException(long loadTime) {}
155 
156         @Override
157         public void recordEviction() {}
158 
159         @Override
160         public CacheStats snapshot() {
161           return EMPTY_STATS;
162         }
163       });
164   static final CacheStats EMPTY_STATS = new CacheStats(0, 0, 0, 0, 0, 0);
165 
166   static final Supplier<SimpleStatsCounter> CACHE_STATS_COUNTER =
167       new Supplier<SimpleStatsCounter>() {
168     @Override
169     public SimpleStatsCounter get() {
170       return new SimpleStatsCounter();
171     }
172   };
173 
174   enum NullListener implements RemovalListener<Object, Object> {
175     INSTANCE;
176 
177     @Override
onRemoval(RemovalNotification<Object, Object> notification)178     public void onRemoval(RemovalNotification<Object, Object> notification) {}
179   }
180 
181   enum OneWeigher implements Weigher<Object, Object> {
182     INSTANCE;
183 
184     @Override
weigh(Object key, Object value)185     public int weigh(Object key, Object value) {
186       return 1;
187     }
188   }
189 
190   static final Ticker NULL_TICKER = new Ticker() {
191     @Override
192     public long read() {
193       return 0;
194     }
195   };
196 
197   private static final Logger logger = Logger.getLogger(CacheBuilder.class.getName());
198 
199   static final int UNSET_INT = -1;
200 
201   boolean strictParsing = true;
202 
203   int initialCapacity = UNSET_INT;
204   int concurrencyLevel = UNSET_INT;
205   long maximumSize = UNSET_INT;
206   long maximumWeight = UNSET_INT;
207   Weigher<? super K, ? super V> weigher;
208 
209   Strength keyStrength;
210   Strength valueStrength;
211 
212   long expireAfterWriteNanos = UNSET_INT;
213   long expireAfterAccessNanos = UNSET_INT;
214   long refreshNanos = UNSET_INT;
215 
216   Equivalence<Object> keyEquivalence;
217   Equivalence<Object> valueEquivalence;
218 
219   RemovalListener<? super K, ? super V> removalListener;
220   Ticker ticker;
221 
222   Supplier<? extends StatsCounter> statsCounterSupplier = CACHE_STATS_COUNTER;
223 
224   // TODO(fry): make constructor private and update tests to use newBuilder
CacheBuilder()225   CacheBuilder() {}
226 
227   /**
228    * Constructs a new {@code CacheBuilder} instance with default settings, including strong keys,
229    * strong values, and no automatic eviction of any kind.
230    */
newBuilder()231   public static CacheBuilder<Object, Object> newBuilder() {
232     return new CacheBuilder<Object, Object>();
233   }
234 
235   /**
236    * Enables lenient parsing. Useful for tests and spec parsing.
237    */
lenientParsing()238   CacheBuilder<K, V> lenientParsing() {
239     strictParsing = false;
240     return this;
241   }
242 
243   /**
244    * Sets a custom {@code Equivalence} strategy for comparing keys.
245    *
246    * <p>By default, the cache uses {@link Equivalences#identity} to determine key equality when
247    * {@link #weakKeys} is specified, and {@link Equivalences#equals()} otherwise.
248    */
keyEquivalence(Equivalence<Object> equivalence)249   CacheBuilder<K, V> keyEquivalence(Equivalence<Object> equivalence) {
250     checkState(keyEquivalence == null, "key equivalence was already set to %s", keyEquivalence);
251     keyEquivalence = checkNotNull(equivalence);
252     return this;
253   }
254 
getKeyEquivalence()255   Equivalence<Object> getKeyEquivalence() {
256     return firstNonNull(keyEquivalence, getKeyStrength().defaultEquivalence());
257   }
258 
259   /**
260    * Sets a custom {@code Equivalence} strategy for comparing values.
261    *
262    * <p>By default, the cache uses {@link Equivalences#identity} to determine value equality when
263    * {@link #weakValues} or {@link #softValues} is specified, and {@link Equivalences#equals()}
264    * otherwise.
265    */
valueEquivalence(Equivalence<Object> equivalence)266   CacheBuilder<K, V> valueEquivalence(Equivalence<Object> equivalence) {
267     checkState(valueEquivalence == null,
268         "value equivalence was already set to %s", valueEquivalence);
269     this.valueEquivalence = checkNotNull(equivalence);
270     return this;
271   }
272 
getValueEquivalence()273   Equivalence<Object> getValueEquivalence() {
274     return firstNonNull(valueEquivalence, getValueStrength().defaultEquivalence());
275   }
276 
277   /**
278    * Sets the minimum total size for the internal hash tables. For example, if the initial capacity
279    * is {@code 60}, and the concurrency level is {@code 8}, then eight segments are created, each
280    * having a hash table of size eight. Providing a large enough estimate at construction time
281    * avoids the need for expensive resizing operations later, but setting this value unnecessarily
282    * high wastes memory.
283    *
284    * @throws IllegalArgumentException if {@code initialCapacity} is negative
285    * @throws IllegalStateException if an initial capacity was already set
286    */
initialCapacity(int initialCapacity)287   public CacheBuilder<K, V> initialCapacity(int initialCapacity) {
288     checkState(this.initialCapacity == UNSET_INT, "initial capacity was already set to %s",
289         this.initialCapacity);
290     checkArgument(initialCapacity >= 0);
291     this.initialCapacity = initialCapacity;
292     return this;
293   }
294 
getInitialCapacity()295   int getInitialCapacity() {
296     return (initialCapacity == UNSET_INT) ? DEFAULT_INITIAL_CAPACITY : initialCapacity;
297   }
298 
299   /**
300    * Guides the allowed concurrency among update operations. Used as a hint for internal sizing. The
301    * table is internally partitioned to try to permit the indicated number of concurrent updates
302    * without contention. Because assignment of entries to these partitions is not necessarily
303    * uniform, the actual concurrency observed may vary. Ideally, you should choose a value to
304    * accommodate as many threads as will ever concurrently modify the table. Using a significantly
305    * higher value than you need can waste space and time, and a significantly lower value can lead
306    * to thread contention. But overestimates and underestimates within an order of magnitude do not
307    * usually have much noticeable impact. A value of one permits only one thread to modify the cache
308    * at a time, but since read operations can proceed concurrently, this still yields higher
309    * concurrency than full synchronization. Defaults to 4.
310    *
311    * <p><b>Note:</b>The default may change in the future. If you care about this value, you should
312    * always choose it explicitly.
313    *
314    * @throws IllegalArgumentException if {@code concurrencyLevel} is nonpositive
315    * @throws IllegalStateException if a concurrency level was already set
316    */
concurrencyLevel(int concurrencyLevel)317   public CacheBuilder<K, V> concurrencyLevel(int concurrencyLevel) {
318     checkState(this.concurrencyLevel == UNSET_INT, "concurrency level was already set to %s",
319         this.concurrencyLevel);
320     checkArgument(concurrencyLevel > 0);
321     this.concurrencyLevel = concurrencyLevel;
322     return this;
323   }
324 
getConcurrencyLevel()325   int getConcurrencyLevel() {
326     return (concurrencyLevel == UNSET_INT) ? DEFAULT_CONCURRENCY_LEVEL : concurrencyLevel;
327   }
328 
329   /**
330    * Specifies the maximum number of entries the cache may contain. Note that the cache <b>may evict
331    * an entry before this limit is exceeded</b>. As the cache size grows close to the maximum, the
332    * cache evicts entries that are less likely to be used again. For example, the cache may evict an
333    * entry because it hasn't been used recently or very often.
334    *
335    * <p>When {@code size} is zero, elements will be evicted immediately after being loaded into the
336    * cache. This can be useful in testing, or to disable caching temporarily without a code change.
337    *
338    * @param size the maximum size of the cache
339    * @throws IllegalArgumentException if {@code size} is negative
340    * @throws IllegalStateException if a maximum size was already set
341    */
maximumSize(long size)342   public CacheBuilder<K, V> maximumSize(long size) {
343     checkState(this.maximumSize == UNSET_INT, "maximum size was already set to %s",
344         this.maximumSize);
345     checkState(this.maximumWeight == UNSET_INT, "maximum weight was already set to %s",
346         this.maximumWeight);
347     checkState(this.weigher == null, "maximum size can not be combined with weigher");
348     checkArgument(size >= 0, "maximum size must not be negative");
349     this.maximumSize = size;
350     return this;
351   }
352 
353   /**
354    * Specifies the maximum weight of entries the cache may contain. Weight is determined using the
355    * {@link Weigher} specified with {@link #weigher}, and use of this method requires a
356    * corresponding call to {@link #weigher} prior to calling {@link #build}.
357    *
358    * <p>Note that the cache <b>may evict an entry before this limit is exceeded</b>. As the cache
359    * size grows close to the maximum, the cache evicts entries that are less likely to be used
360    * again. For example, the cache may evict an entry because it hasn't been used recently or very
361    * often.
362    *
363    * <p>When {@code weight} is zero, elements will be evicted immediately after being loaded into
364    * cache. This can be useful in testing, or to disable caching temporarily without a code
365    * change.
366    *
367    * @param weight the maximum weight the cache may contain
368    * @throws IllegalArgumentException if {@code size} is negative
369    * @throws IllegalStateException if a maximum size was already set
370    * @since 11.0
371    */
maximumWeight(long weight)372   public CacheBuilder<K, V> maximumWeight(long weight) {
373     checkState(this.maximumWeight == UNSET_INT, "maximum weight was already set to %s",
374         this.maximumWeight);
375     checkState(this.maximumSize == UNSET_INT, "maximum size was already set to %s",
376         this.maximumSize);
377     this.maximumWeight = weight;
378     checkArgument(weight >= 0, "maximum weight must not be negative");
379     return this;
380   }
381 
382   /**
383    * Specifies the weigher to use in determining the weight of entries. Entry weight is taken
384    * into consideration by {@link #maximumWeight(long)} when determining which entries to evict, and
385    * use of this method requires a corresponding call to {@link #maximumWeight(long)} prior to
386    * calling {@link #build}. Weights are measured and recorded when entries are inserted into the
387    * cache, and are thus effectively static during the lifetime of a cache entry.
388    *
389    * <p>When the weight of an entry is zero it will not be considered for size-based eviction
390    * (though it still may be evicted by other means).
391    *
392    * <p><b>Important note:</b> Instead of returning <em>this</em> as a {@code CacheBuilder}
393    * instance, this method returns {@code CacheBuilder<K1, V1>}. From this point on, either the
394    * original reference or the returned reference may be used to complete configuration and build
395    * the cache, but only the "generic" one is type-safe. That is, it will properly prevent you from
396    * building caches whose key or value types are incompatible with the types accepted by the
397    * weigher already provided; the {@code CacheBuilder} type cannot do this. For best results,
398    * simply use the standard method-chaining idiom, as illustrated in the documentation at top,
399    * configuring a {@code CacheBuilder} and building your {@link Cache} all in a single statement.
400    *
401    * <p><b>Warning:</b> if you ignore the above advice, and use this {@code CacheBuilder} to build
402    * a cache whose key or value type is incompatible with the weigher, you will likely experience
403    * a {@link ClassCastException} at some <i>undefined</i> point in the future.
404    *
405    * @param weigher the weigher to use in calculating the weight of cache entries
406    * @throws IllegalArgumentException if {@code size} is negative
407    * @throws IllegalStateException if a maximum size was already set
408    * @since 11.0
409    */
weigher( Weigher<? super K1, ? super V1> weigher)410   public <K1 extends K, V1 extends V> CacheBuilder<K1, V1> weigher(
411       Weigher<? super K1, ? super V1> weigher) {
412     checkState(this.weigher == null);
413     if (strictParsing) {
414       checkState(this.maximumSize == UNSET_INT, "weigher can not be combined with maximum size",
415           this.maximumSize);
416     }
417 
418     // safely limiting the kinds of caches this can produce
419     @SuppressWarnings("unchecked")
420     CacheBuilder<K1, V1> me = (CacheBuilder<K1, V1>) this;
421     me.weigher = checkNotNull(weigher);
422     return me;
423   }
424 
getMaximumWeight()425   long getMaximumWeight() {
426     if (expireAfterWriteNanos == 0 || expireAfterAccessNanos == 0) {
427       return 0;
428     }
429     return (weigher == null) ? maximumSize : maximumWeight;
430   }
431 
432   // Make a safe contravariant cast now so we don't have to do it over and over.
433   @SuppressWarnings("unchecked")
getWeigher()434   <K1 extends K, V1 extends V> Weigher<K1, V1> getWeigher() {
435     return (Weigher<K1, V1>) Objects.firstNonNull(weigher, OneWeigher.INSTANCE);
436   }
437 
438   /**
439    * Specifies that each key (not value) stored in the cache should be strongly referenced.
440    *
441    * @throws IllegalStateException if the key strength was already set
442    */
strongKeys()443   CacheBuilder<K, V> strongKeys() {
444     return setKeyStrength(Strength.STRONG);
445   }
446 
447   /**
448    * Specifies that each key (not value) stored in the cache should be wrapped in a {@link
449    * WeakReference} (by default, strong references are used).
450    *
451    * <p><b>Warning:</b> when this method is used, the resulting cache will use identity ({@code ==})
452    * comparison to determine equality of keys.
453    *
454    * <p>Entries with keys that have been garbage collected may be counted in {@link Cache#size},
455    * but will never be visible to read or write operations; such entries are cleaned up as part of
456    * the routine maintenance described in the class javadoc.
457    *
458    * @throws IllegalStateException if the key strength was already set
459    */
460   @GwtIncompatible("java.lang.ref.WeakReference")
weakKeys()461   public CacheBuilder<K, V> weakKeys() {
462     return setKeyStrength(Strength.WEAK);
463   }
464 
setKeyStrength(Strength strength)465   CacheBuilder<K, V> setKeyStrength(Strength strength) {
466     checkState(keyStrength == null, "Key strength was already set to %s", keyStrength);
467     keyStrength = checkNotNull(strength);
468     return this;
469   }
470 
getKeyStrength()471   Strength getKeyStrength() {
472     return firstNonNull(keyStrength, Strength.STRONG);
473   }
474 
475   /**
476    * Specifies that each value (not key) stored in the cache should be strongly referenced.
477    *
478    * @throws IllegalStateException if the value strength was already set
479    */
strongValues()480   CacheBuilder<K, V> strongValues() {
481     return setValueStrength(Strength.STRONG);
482   }
483 
484   /**
485    * Specifies that each value (not key) stored in the cache should be wrapped in a
486    * {@link WeakReference} (by default, strong references are used).
487    *
488    * <p>Weak values will be garbage collected once they are weakly reachable. This makes them a poor
489    * candidate for caching; consider {@link #softValues} instead.
490    *
491    * <p><b>Note:</b> when this method is used, the resulting cache will use identity ({@code ==})
492    * comparison to determine equality of values.
493    *
494    * <p>Entries with values that have been garbage collected may be counted in {@link Cache#size},
495    * but will never be visible to read or write operations; such entries are cleaned up as part of
496    * the routine maintenance described in the class javadoc.
497    *
498    * @throws IllegalStateException if the value strength was already set
499    */
500   @GwtIncompatible("java.lang.ref.WeakReference")
weakValues()501   public CacheBuilder<K, V> weakValues() {
502     return setValueStrength(Strength.WEAK);
503   }
504 
505   /**
506    * Specifies that each value (not key) stored in the cache should be wrapped in a
507    * {@link SoftReference} (by default, strong references are used). Softly-referenced objects will
508    * be garbage-collected in a <i>globally</i> least-recently-used manner, in response to memory
509    * demand.
510    *
511    * <p><b>Warning:</b> in most circumstances it is better to set a per-cache {@linkplain
512    * #maximumSize(long) maximum size} instead of using soft references. You should only use this
513    * method if you are well familiar with the practical consequences of soft references.
514    *
515    * <p><b>Note:</b> when this method is used, the resulting cache will use identity ({@code ==})
516    * comparison to determine equality of values.
517    *
518    * <p>Entries with values that have been garbage collected may be counted in {@link Cache#size},
519    * but will never be visible to read or write operations; such entries are cleaned up as part of
520    * the routine maintenance described in the class javadoc.
521    *
522    * @throws IllegalStateException if the value strength was already set
523    */
524   @GwtIncompatible("java.lang.ref.SoftReference")
softValues()525   public CacheBuilder<K, V> softValues() {
526     return setValueStrength(Strength.SOFT);
527   }
528 
setValueStrength(Strength strength)529   CacheBuilder<K, V> setValueStrength(Strength strength) {
530     checkState(valueStrength == null, "Value strength was already set to %s", valueStrength);
531     valueStrength = checkNotNull(strength);
532     return this;
533   }
534 
getValueStrength()535   Strength getValueStrength() {
536     return firstNonNull(valueStrength, Strength.STRONG);
537   }
538 
539   /**
540    * Specifies that each entry should be automatically removed from the cache once a fixed duration
541    * has elapsed after the entry's creation, or the most recent replacement of its value.
542    *
543    * <p>When {@code duration} is zero, this method hands off to
544    * {@link #maximumSize(long) maximumSize}{@code (0)}, ignoring any otherwise-specificed maximum
545    * size or weight. This can be useful in testing, or to disable caching temporarily without a code
546    * change.
547    *
548    * <p>Expired entries may be counted in {@link Cache#size}, but will never be visible to read or
549    * write operations. Expired entries are cleaned up as part of the routine maintenance described
550    * in the class javadoc.
551    *
552    * @param duration the length of time after an entry is created that it should be automatically
553    *     removed
554    * @param unit the unit that {@code duration} is expressed in
555    * @throws IllegalArgumentException if {@code duration} is negative
556    * @throws IllegalStateException if the time to live or time to idle was already set
557    */
expireAfterWrite(long duration, TimeUnit unit)558   public CacheBuilder<K, V> expireAfterWrite(long duration, TimeUnit unit) {
559     checkState(expireAfterWriteNanos == UNSET_INT, "expireAfterWrite was already set to %s ns",
560         expireAfterWriteNanos);
561     checkArgument(duration >= 0, "duration cannot be negative: %s %s", duration, unit);
562     this.expireAfterWriteNanos = unit.toNanos(duration);
563     return this;
564   }
565 
getExpireAfterWriteNanos()566   long getExpireAfterWriteNanos() {
567     return (expireAfterWriteNanos == UNSET_INT) ? DEFAULT_EXPIRATION_NANOS : expireAfterWriteNanos;
568   }
569 
570   /**
571    * Specifies that each entry should be automatically removed from the cache once a fixed duration
572    * has elapsed after the entry's creation, the most recent replacement of its value, or its last
573    * access. Access time is reset by all cache read and write operations (including
574    * {@code Cache.asMap().get(Object)} and {@code Cache.asMap().put(K, V)}), but not by operations
575    * on the collection-views of {@link Cache#asMap}.
576    *
577    * <p>When {@code duration} is zero, this method hands off to
578    * {@link #maximumSize(long) maximumSize}{@code (0)}, ignoring any otherwise-specificed maximum
579    * size or weight. This can be useful in testing, or to disable caching temporarily without a code
580    * change.
581    *
582    * <p>Expired entries may be counted in {@link Cache#size}, but will never be visible to read or
583    * write operations. Expired entries are cleaned up as part of the routine maintenance described
584    * in the class javadoc.
585    *
586    * @param duration the length of time after an entry is last accessed that it should be
587    *     automatically removed
588    * @param unit the unit that {@code duration} is expressed in
589    * @throws IllegalArgumentException if {@code duration} is negative
590    * @throws IllegalStateException if the time to idle or time to live was already set
591    */
expireAfterAccess(long duration, TimeUnit unit)592   public CacheBuilder<K, V> expireAfterAccess(long duration, TimeUnit unit) {
593     checkState(expireAfterAccessNanos == UNSET_INT, "expireAfterAccess was already set to %s ns",
594         expireAfterAccessNanos);
595     checkArgument(duration >= 0, "duration cannot be negative: %s %s", duration, unit);
596     this.expireAfterAccessNanos = unit.toNanos(duration);
597     return this;
598   }
599 
getExpireAfterAccessNanos()600   long getExpireAfterAccessNanos() {
601     return (expireAfterAccessNanos == UNSET_INT)
602         ? DEFAULT_EXPIRATION_NANOS : expireAfterAccessNanos;
603   }
604 
605   /**
606    * Specifies that active entries are eligible for automatic refresh once a fixed duration has
607    * elapsed after the entry's creation, or the most recent replacement of its value. The semantics
608    * of refreshes are specified in {@link LoadingCache#refresh}, and are performed by calling
609    * {@link CacheLoader#reload}.
610    *
611    * <p>As the default implementation of {@link CacheLoader#reload} is synchronous, it is
612    * recommended that users of this method override {@link CacheLoader#reload} with an asynchrnous
613    * implementation; otherwise refreshes will block other cache operations.
614    *
615    * <p>Currently automatic refreshes are performed when the first stale request for an entry
616    * occurs. The request triggering refresh will make a blocking call to {@link CacheLoader#reload}
617    * and immediately return the new value if the returned future is complete, and the old value
618    * otherwise.
619    *
620    * <p><b>Note:</b> <i>all exceptions thrown during refresh will be logged and then swallowed</i>.
621    *
622    * @param duration the length of time after an entry is created that it should be considered
623    *     stale, and thus eligible for refresh
624    * @param unit the unit that {@code duration} is expressed in
625    * @throws IllegalArgumentException if {@code duration} is negative
626    * @throws IllegalStateException if the refresh interval was already set
627    * @since 11.0
628    */
629   @GwtIncompatible("To be supported")
refreshAfterWrite(long duration, TimeUnit unit)630   public CacheBuilder<K, V> refreshAfterWrite(long duration, TimeUnit unit) {
631     checkNotNull(unit);
632     checkState(refreshNanos == UNSET_INT, "refresh was already set to %s ns", refreshNanos);
633     checkArgument(duration > 0, "duration must be positive: %s %s", duration, unit);
634     this.refreshNanos = unit.toNanos(duration);
635     return this;
636   }
637 
getRefreshNanos()638   long getRefreshNanos() {
639     return (refreshNanos == UNSET_INT) ? DEFAULT_REFRESH_NANOS : refreshNanos;
640   }
641 
642   /**
643    * Specifies a nanosecond-precision time source for use in determining when entries should be
644    * expired. By default, {@link System#nanoTime} is used.
645    *
646    * <p>The primary intent of this method is to facilitate testing of caches which have been
647    * configured with {@link #expireAfterWrite} or {@link #expireAfterAccess}.
648    *
649    * @throws IllegalStateException if a ticker was already set
650    */
651   @GwtIncompatible("To be supported")
ticker(Ticker ticker)652   public CacheBuilder<K, V> ticker(Ticker ticker) {
653     checkState(this.ticker == null);
654     this.ticker = checkNotNull(ticker);
655     return this;
656   }
657 
getTicker(boolean recordsTime)658   Ticker getTicker(boolean recordsTime) {
659     if (ticker != null) {
660       return ticker;
661     }
662     return recordsTime ? Ticker.systemTicker() : NULL_TICKER;
663   }
664 
665   /**
666    * Specifies a listener instance, which all caches built using this {@code CacheBuilder} will
667    * notify each time an entry is removed from the cache by any means.
668    *
669    * <p>Each cache built by this {@code CacheBuilder} after this method is called invokes the
670    * supplied listener after removing an element for any reason (see removal causes in {@link
671    * RemovalCause}). It will invoke the listener as part of the routine maintenance described
672    * in the class javadoc.
673    *
674    * <p><b>Note:</b> <i>all exceptions thrown by {@code listener} will be logged (using
675    * {@link java.util.logging.Logger})and then swallowed</i>.
676    *
677    * <p><b>Important note:</b> Instead of returning <em>this</em> as a {@code CacheBuilder}
678    * instance, this method returns {@code CacheBuilder<K1, V1>}. From this point on, either the
679    * original reference or the returned reference may be used to complete configuration and build
680    * the cache, but only the "generic" one is type-safe. That is, it will properly prevent you from
681    * building caches whose key or value types are incompatible with the types accepted by the
682    * listener already provided; the {@code CacheBuilder} type cannot do this. For best results,
683    * simply use the standard method-chaining idiom, as illustrated in the documentation at top,
684    * configuring a {@code CacheBuilder} and building your {@link Cache} all in a single statement.
685    *
686    * <p><b>Warning:</b> if you ignore the above advice, and use this {@code CacheBuilder} to build
687    * a cache whose key or value type is incompatible with the listener, you will likely experience
688    * a {@link ClassCastException} at some <i>undefined</i> point in the future.
689    *
690    * @throws IllegalStateException if a removal listener was already set
691    */
692   @CheckReturnValue
693   @GwtIncompatible("To be supported")
removalListener( RemovalListener<? super K1, ? super V1> listener)694   public <K1 extends K, V1 extends V> CacheBuilder<K1, V1> removalListener(
695       RemovalListener<? super K1, ? super V1> listener) {
696     checkState(this.removalListener == null);
697 
698     // safely limiting the kinds of caches this can produce
699     @SuppressWarnings("unchecked")
700     CacheBuilder<K1, V1> me = (CacheBuilder<K1, V1>) this;
701     me.removalListener = checkNotNull(listener);
702     return me;
703   }
704 
705   // Make a safe contravariant cast now so we don't have to do it over and over.
706   @SuppressWarnings("unchecked")
getRemovalListener()707   <K1 extends K, V1 extends V> RemovalListener<K1, V1> getRemovalListener() {
708     return (RemovalListener<K1, V1>) Objects.firstNonNull(removalListener, NullListener.INSTANCE);
709   }
710 
711   /**
712    * Disable the accumulation of {@link CacheStats} during the operation of the cache.
713    */
disableStats()714   CacheBuilder<K, V> disableStats() {
715     checkState(statsCounterSupplier == CACHE_STATS_COUNTER);
716     statsCounterSupplier = NULL_STATS_COUNTER;
717     return this;
718   }
719 
getStatsCounterSupplier()720   Supplier<? extends StatsCounter> getStatsCounterSupplier() {
721     return statsCounterSupplier;
722   }
723 
724   /**
725    * Builds a cache, which either returns an already-loaded value for a given key or atomically
726    * computes or retrieves it using the supplied {@code CacheLoader}. If another thread is currently
727    * loading the value for this key, simply waits for that thread to finish and returns its
728    * loaded value. Note that multiple threads can concurrently load values for distinct keys.
729    *
730    * <p>This method does not alter the state of this {@code CacheBuilder} instance, so it can be
731    * invoked again to create multiple independent caches.
732    *
733    * @param loader the cache loader used to obtain new values
734    * @return a cache having the requested features
735    */
build( CacheLoader<? super K1, V1> loader)736   public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
737       CacheLoader<? super K1, V1> loader) {
738     checkWeightWithWeigher();
739     return new LocalCache.LocalLoadingCache<K1, V1>(this, loader);
740   }
741 
742   /**
743    * Builds a cache which does not automatically load values when keys are requested.
744    *
745    * <p>Consider {@link #build(CacheLoader)} instead, if it is feasible to implement a
746    * {@code CacheLoader}.
747    *
748    * <p>This method does not alter the state of this {@code CacheBuilder} instance, so it can be
749    * invoked again to create multiple independent caches.
750    *
751    * @return a cache having the requested features
752    * @since 11.0
753    */
build()754   public <K1 extends K, V1 extends V> Cache<K1, V1> build() {
755     checkWeightWithWeigher();
756     checkNonLoadingCache();
757     return new LocalCache.LocalManualCache<K1, V1>(this);
758   }
759 
checkNonLoadingCache()760   private void checkNonLoadingCache() {
761     checkState(refreshNanos == UNSET_INT, "refreshAfterWrite requires a LoadingCache");
762   }
763 
checkWeightWithWeigher()764   private void checkWeightWithWeigher() {
765     if (weigher == null) {
766       checkState(maximumWeight == UNSET_INT, "maximumWeight requires weigher");
767     } else {
768       if (strictParsing) {
769         checkState(maximumWeight != UNSET_INT, "weigher requires maximumWeight");
770       } else {
771         if (maximumWeight == UNSET_INT) {
772           logger.log(Level.WARNING, "ignoring weigher specified without maximumWeight");
773         }
774       }
775     }
776   }
777 
778   /**
779    * Returns a string representation for this CacheBuilder instance. The exact form of the returned
780    * string is not specified.
781    */
782   @Override
toString()783   public String toString() {
784     Objects.ToStringHelper s = Objects.toStringHelper(this);
785     if (initialCapacity != UNSET_INT) {
786       s.add("initialCapacity", initialCapacity);
787     }
788     if (concurrencyLevel != UNSET_INT) {
789       s.add("concurrencyLevel", concurrencyLevel);
790     }
791     if (maximumWeight != UNSET_INT) {
792       if (weigher == null) {
793         s.add("maximumSize", maximumWeight);
794       } else {
795         s.add("maximumWeight", maximumWeight);
796       }
797     }
798     if (expireAfterWriteNanos != UNSET_INT) {
799       s.add("expireAfterWrite", expireAfterWriteNanos + "ns");
800     }
801     if (expireAfterAccessNanos != UNSET_INT) {
802       s.add("expireAfterAccess", expireAfterAccessNanos + "ns");
803     }
804     if (keyStrength != null) {
805       s.add("keyStrength", Ascii.toLowerCase(keyStrength.toString()));
806     }
807     if (valueStrength != null) {
808       s.add("valueStrength", Ascii.toLowerCase(valueStrength.toString()));
809     }
810     if (keyEquivalence != null) {
811       s.addValue("keyEquivalence");
812     }
813     if (valueEquivalence != null) {
814       s.addValue("valueEquivalence");
815     }
816     if (removalListener != null) {
817       s.addValue("removalListener");
818     }
819     return s.toString();
820   }
821 }
822