diff options
Diffstat (limited to 'libjava/classpath/java/lang/ThreadLocal.java')
| -rw-r--r-- | libjava/classpath/java/lang/ThreadLocal.java | 39 | 
1 files changed, 27 insertions, 12 deletions
diff --git a/libjava/classpath/java/lang/ThreadLocal.java b/libjava/classpath/java/lang/ThreadLocal.java index 6c4ba176a41..14778c65c2f 100644 --- a/libjava/classpath/java/lang/ThreadLocal.java +++ b/libjava/classpath/java/lang/ThreadLocal.java @@ -37,9 +37,6 @@ exception statement from your version. */  package java.lang; -import java.util.Map; - -  /**   * ThreadLocal objects have a different state associated with every   * Thread that accesses them. Every access to the ThreadLocal object @@ -93,13 +90,31 @@ public class ThreadLocal<T>     * user. Do not expose this to the public. Package visible for use by     * InheritableThreadLocal     */ -  static final Object sentinel = new Object(); +  static final Object notFound = new Object(); + +  /** +   * The base for the computation of the next hash for a thread local. +   */ +  private static int nextHashBase = 1; + +  /** +   * Allocate a new hash. +   */ +  private synchronized int computeNextHash() { +    return nextHashBase++ * 6709; +  } + +  /** +   * Hash code computed for ThreadLocalMap +   */ +  final int fastHash;    /**     * Creates a ThreadLocal object without associating any value to it yet.     */    public ThreadLocal()    { +    fastHash = computeNextHash();    }    /** @@ -125,16 +140,16 @@ public class ThreadLocal<T>     */    public T get()    { -    Map<ThreadLocal<T>,T> map = (Map<ThreadLocal<T>,T>) Thread.getThreadLocals(); +    ThreadLocalMap map = Thread.getThreadLocals();      // Note that we don't have to synchronize, as only this thread will      // ever modify the map. -    T value = map.get(this); -    if (value == null) +    T value = (T) map.get(this); +    if (value == notFound)        {          value = initialValue(); -        map.put(this, (T) (value == null ? sentinel : value)); +        map.set(this, value);        } -    return value == (T) sentinel ? null : value; +    return value;    }    /** @@ -147,10 +162,10 @@ public class ThreadLocal<T>     */    public void set(T value)    { -    Map map = Thread.getThreadLocals(); +    ThreadLocalMap map = Thread.getThreadLocals();      // Note that we don't have to synchronize, as only this thread will      // ever modify the map. -    map.put(this, value == null ? sentinel : value); +    map.set(this, value);    }    /** @@ -160,7 +175,7 @@ public class ThreadLocal<T>     */    public void remove()    { -    Map map = Thread.getThreadLocals(); +    ThreadLocalMap map = Thread.getThreadLocals();      map.remove(this);    }  }  | 

