aboutsummaryrefslogblamecommitdiff
path: root/stage1/KeyLockedLazyCache.scala
blob: c8b37eace5f6941953c91d8c934c5fd4b5282f37 (plain) (tree)
































                                                                     
/*
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      
    }
  }
}
*/