java.lang.ref.WeakReference Scala Examples
The following examples show how to use java.lang.ref.WeakReference.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: Symbol.scala From perf_tester with Apache License 2.0 | 5 votes |
package scala private[scala] abstract class UniquenessCache[K, V >: Null] { import java.lang.ref.WeakReference import java.util.WeakHashMap import java.util.concurrent.locks.ReentrantReadWriteLock private val rwl = new ReentrantReadWriteLock() private val rlock = rwl.readLock private val wlock = rwl.writeLock private val map = new WeakHashMap[K, WeakReference[V]] protected def valueFromKey(k: K): V protected def keyFromValue(v: V): Option[K] def apply(name: K): V = { def cached(): V = { rlock.lock try { val reference = map get name if (reference == null) null else reference.get // will be null if we were gc-ed } finally rlock.unlock } def updateCache(): V = { wlock.lock try { val res = cached() if (res != null) res else { // If we don't remove the old String key from the map, we can // wind up with one String as the key and a different String as // the name field in the Symbol, which can lead to surprising GC // behavior and duplicate Symbols. See scala/bug#6706. map remove name val sym = valueFromKey(name) map.put(name, new WeakReference(sym)) sym } } finally wlock.unlock } val res = cached() if (res == null) updateCache() else res } def unapply(other: V): Option[K] = keyFromValue(other) }
Example 2
Source File: UniquenessCache.scala From incubator-daffodil with Apache License 2.0 | 5 votes |
package org.apache.daffodil.util abstract class UniquenessCache[K, V >: Null] { import java.lang.ref.WeakReference import java.util.WeakHashMap import java.util.concurrent.locks.ReentrantReadWriteLock private[this] val rwl = new ReentrantReadWriteLock() private[this] val rlock = rwl.readLock private[this] val wlock = rwl.writeLock private[this] val map = new WeakHashMap[K, WeakReference[V]] protected def valueFromKey(k: K): V protected def keyFromValue(v: V): Option[K] def apply(name: K): V = { def cached(): V = { rlock.lock try { val reference = map get name if (reference == null) null else reference.get // will be null if we were gc-ed } finally rlock.unlock } def updateCache(): V = { wlock.lock try { val res = cached() if (res != null) res else { // If we don't remove the old String key from the map, we can // wind up with one String as the key and a different String as // the name field in the Symbol, which can lead to surprising GC // behavior and duplicate Symbols. See scala/bug#6706. map remove name val sym = valueFromKey(name) map.put(name, new WeakReference(sym)) sym } } finally wlock.unlock } val res = cached() if (res == null) updateCache() else res } def unapply(other: V): Option[K] = keyFromValue(other) }
Example 3
Source File: cache.scala From libisabelle with Apache License 2.0 | 5 votes |
package isabelle import java.util.{Collections, WeakHashMap} import java.lang.ref.WeakReference class Cache(initial_size: Int = 131071, max_string: Int = 100) { private val table = Collections.synchronizedMap(new WeakHashMap[Any, WeakReference[Any]](initial_size)) def size: Int = table.size override def toString: String = "Cache(" + size + ")" protected def lookup[A](x: A): Option[A] = { val ref = table.get(x) if (ref == null) None else { val y = ref.asInstanceOf[WeakReference[A]].get if (y == null) None else Some(y) } } protected def store[A](x: A): A = { table.put(x, new WeakReference[Any](x)) x } protected def cache_int(x: Int): Int = lookup(x) getOrElse store(x) protected def cache_string(x: String): String = { if (x == "") "" else if (x == "true") "true" else if (x == "false") "false" else if (x == "0.0") "0.0" else if (Library.is_small_int(x)) Library.signed_string_of_int(Integer.parseInt(x)) else { lookup(x) match { case Some(y) => y case None => val z = Library.isolate_substring(x) if (z.length > max_string) z else store(z) } } } // main methods def int(x: Int): Int = synchronized { cache_int(x) } def string(x: String): String = synchronized { cache_string(x) } }
Example 4
Source File: cache.scala From libisabelle with Apache License 2.0 | 5 votes |
package isabelle import java.util.{Collections, WeakHashMap} import java.lang.ref.WeakReference class Cache(initial_size: Int = 131071, max_string: Int = 100) { private val table = Collections.synchronizedMap(new WeakHashMap[Any, WeakReference[Any]](initial_size)) def size: Int = table.size override def toString: String = "Cache(" + size + ")" protected def lookup[A](x: A): Option[A] = { val ref = table.get(x) if (ref == null) None else { val y = ref.asInstanceOf[WeakReference[A]].get if (y == null) None else Some(y) } } protected def store[A](x: A): A = { table.put(x, new WeakReference[Any](x)) x } protected def cache_int(x: Int): Int = lookup(x) getOrElse store(x) protected def cache_string(x: String): String = { if (x == "") "" else if (x == "true") "true" else if (x == "false") "false" else if (x == "0.0") "0.0" else if (Library.is_small_int(x)) Library.signed_string_of_int(Integer.parseInt(x)) else { lookup(x) match { case Some(y) => y case None => val z = Library.isolate_substring(x) if (z.length > max_string) z else store(z) } } } // main methods def int(x: Int): Int = synchronized { cache_int(x) } def string(x: String): String = synchronized { cache_string(x) } }