aboutsummaryrefslogtreecommitdiff
path: root/stage1/KeyLockedLazyCache.scala
diff options
context:
space:
mode:
Diffstat (limited to 'stage1/KeyLockedLazyCache.scala')
-rw-r--r--stage1/KeyLockedLazyCache.scala8
1 files changed, 8 insertions, 0 deletions
diff --git a/stage1/KeyLockedLazyCache.scala b/stage1/KeyLockedLazyCache.scala
index 2047b81..aac32a3 100644
--- a/stage1/KeyLockedLazyCache.scala
+++ b/stage1/KeyLockedLazyCache.scala
@@ -10,7 +10,11 @@ final private[cbt] class KeyLockedLazyCache[T <: AnyRef](
val hashMap: java.util.Map[AnyRef,AnyRef],
logger: Option[Logger]
){
+ final val seen = new ThreadLocal[collection.mutable.Set[AnyRef]](){
+ override protected def initialValue = collection.mutable.Set[AnyRef]();
+ }
def get( key: AnyRef, value: => T ): T = {
+ seen.get.add( key );
val lockableKey = hashMap.synchronized{
if( ! (hashMap containsKey key) ){
val lockableKey = new LockableKey
@@ -35,6 +39,10 @@ final private[cbt] class KeyLockedLazyCache[T <: AnyRef](
}
}
def update( key: AnyRef, value: T ): T = {
+ assert(
+ !seen.get.contains( key ),
+ "Thread tries to update cache key after observing it: " + key
+ )
val lockableKey = hashMap get key
lockableKey.synchronized{
hashMap.put( lockableKey, value )