summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/java/lang/ThreadLocal.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/java/lang/ThreadLocal.java')
-rw-r--r--libjava/classpath/java/lang/ThreadLocal.java39
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);
}
}
OpenPOWER on IntegriCloud