diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-12 00:02:22 -0500 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-12 00:29:21 -0500 |
commit | dba77034209f7f08e5b0f894d1973686f688c2d0 (patch) | |
tree | 68d412a23cc4242bcc7618d55243f14b5dc58c1a /stage1/KeyLockedLazyCache.scala | |
parent | 55fff670befc97a871cf0f85c65764e108f3d3c1 (diff) | |
download | cbt-dba77034209f7f08e5b0f894d1973686f688c2d0.tar.gz cbt-dba77034209f7f08e5b0f894d1973686f688c2d0.tar.bz2 cbt-dba77034209f7f08e5b0f894d1973686f688c2d0.zip |
A draft implementation that runs builds concurrently (probably buggy right now). Is CBT "reactive" now ;)?
Diffstat (limited to 'stage1/KeyLockedLazyCache.scala')
-rw-r--r-- | stage1/KeyLockedLazyCache.scala | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/stage1/KeyLockedLazyCache.scala b/stage1/KeyLockedLazyCache.scala new file mode 100644 index 0000000..c8b37ea --- /dev/null +++ b/stage1/KeyLockedLazyCache.scala @@ -0,0 +1,33 @@ +/* +package cbt +import java.util.concurrent.ConcurrentHashMap +import scala.concurrent.Future + +/** +A cache that lazily computes values if needed during lookup. +Locking occurs on the key, so separate keys can be looked up +simultaneously without a deadlock. +*/ +final private[cbt] class KeyLockedLazyCache[Key <: AnyRef,Value]{ + private val keys = new ConcurrentHashMap[Key,LockableKey]() + private val builds = new ConcurrentHashMap[LockableKey,Value]() + + private class LockableKey + def get( key: Key, value: => Value ): Value = { + val keyObject = keys.synchronized{ + if( ! (keys containsKey key) ){ + keys.put( key, new LockableKey ) + } + keys get key + } + // synchronizing on key only, so asking for a particular key does + // not block the whole cache, but just that cache entry + key.synchronized{ + if( ! (builds containsKey keyObject) ){ + builds.put( keyObject, value ) + } + builds get keyObject + } + } +} +*/ |