- Fixed #54 - Async expiration listeners do not work if the map is not built with them.
- Fixed #55 - ConcurrentModificationException when using EntryTreeHashMap's iterator
- Added
maxSize
- Fixed #36 - Entry/value iterators may show duplicates when variable expiration enabled.
- Fixed #31 -
setExpiration(K, long, TimeUnit)
throws NPE for non-existent keys - Fixed #33 - Entry loader may be called twice for same key under heavy load
- Fixed #29 -
remove(Object)
releases write lock prematurely
- Added
getExpirationPolicy(key)
- Added separate asynchronous expiration listener APIs
- Added Google App Engine support via
ExpiringMap.setThreadFactory(ThreadFactory)
.
- Fixed #28 - Problems with
map.containsValue()
andvalues().containsAll()
.
- Added OSGI bundle.
- Fixed #20 - Daemonize pooled threads
- Added support for variable expiration lazily loaded entries.
- Fixed #15 - Catch synchronous expirationlistener invocation exceptions.
- Added
ExpiringMap.Builder.expiringEntryLoader
. ExpirationPolicy
,ExpirationListener
, andEntryLoader
are no longer inner types onExpiringMap
and are now top level types on thenet.jodah.expiringmap
package.
- Fixed #12 - Idempotent puts should reset expiration when
ExpirationPolicy
isACCESSSED
.
- Added
getExpectedExpiration
to learn the remaining time left before an entry is expected to expire. Merged from pull request #9.
- Added proper support for
entrySet()
,keyset()
andvalues()
.
- Removed
valuesIterator()
. Instead usevalues().iterator()
.
- Added support for entry loaders. Addresses issue #4.
- Replaced internal
Timer
withScheduledThreadPoolExecutor
. Addresses issue #5. - Added
toString()
implementation for map and entries.
- Added
ExpiringMap.Builder.entryLoader
. - Added
ExpiringMap.Builder.expirationListeners
.
- Added implementation of
ConcurrentMap
. - Replaced internal synchronization with separate read/write locks.
- Fixed NPE when putting a value over a previously put null value.
Initial release