1/*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package java.lang;
27import java.lang.ref.*;
28import java.util.Objects;
29import java.util.concurrent.atomic.AtomicInteger;
30import java.util.function.Supplier;
31
32/**
33 * This class provides thread-local variables.  These variables differ from
34 * their normal counterparts in that each thread that accesses one (via its
35 * {@code get} or {@code set} method) has its own, independently initialized
36 * copy of the variable.  {@code ThreadLocal} instances are typically private
37 * static fields in classes that wish to associate state with a thread (e.g.,
38 * a user ID or Transaction ID).
39 *
40 * <p>For example, the class below generates unique identifiers local to each
41 * thread.
42 * A thread's id is assigned the first time it invokes {@code ThreadId.get()}
43 * and remains unchanged on subsequent calls.
44 * <pre>
45 * import java.util.concurrent.atomic.AtomicInteger;
46 *
47 * public class ThreadId {
48 *     // Atomic integer containing the next thread ID to be assigned
49 *     private static final AtomicInteger nextId = new AtomicInteger(0);
50 *
51 *     // Thread local variable containing each thread's ID
52 *     private static final ThreadLocal&lt;Integer&gt; threadId =
53 *         new ThreadLocal&lt;Integer&gt;() {
54 *             &#64;Override protected Integer initialValue() {
55 *                 return nextId.getAndIncrement();
56 *         }
57 *     };
58 *
59 *     // Returns the current thread's unique ID, assigning it if necessary
60 *     public static int get() {
61 *         return threadId.get();
62 *     }
63 * }
64 * </pre>
65 * <p>Each thread holds an implicit reference to its copy of a thread-local
66 * variable as long as the thread is alive and the {@code ThreadLocal}
67 * instance is accessible; after a thread goes away, all of its copies of
68 * thread-local instances are subject to garbage collection (unless other
69 * references to these copies exist).
70 *
71 * @author  Josh Bloch and Doug Lea
72 * @since   1.2
73 */
74public class ThreadLocal<T> {
75    /**
76     * ThreadLocals rely on per-thread linear-probe hash maps attached
77     * to each thread (Thread.threadLocals and
78     * inheritableThreadLocals).  The ThreadLocal objects act as keys,
79     * searched via threadLocalHashCode.  This is a custom hash code
80     * (useful only within ThreadLocalMaps) that eliminates collisions
81     * in the common case where consecutively constructed ThreadLocals
82     * are used by the same threads, while remaining well-behaved in
83     * less common cases.
84     */
85    private final int threadLocalHashCode = nextHashCode();
86
87    /**
88     * The next hash code to be given out. Updated atomically. Starts at
89     * zero.
90     */
91    private static AtomicInteger nextHashCode =
92        new AtomicInteger();
93
94    /**
95     * The difference between successively generated hash codes - turns
96     * implicit sequential thread-local IDs into near-optimally spread
97     * multiplicative hash values for power-of-two-sized tables.
98     */
99    private static final int HASH_INCREMENT = 0x61c88647;
100
101    /**
102     * Returns the next hash code.
103     */
104    private static int nextHashCode() {
105        return nextHashCode.getAndAdd(HASH_INCREMENT);
106    }
107
108    /**
109     * Returns the current thread's "initial value" for this
110     * thread-local variable.  This method will be invoked the first
111     * time a thread accesses the variable with the {@link #get}
112     * method, unless the thread previously invoked the {@link #set}
113     * method, in which case the {@code initialValue} method will not
114     * be invoked for the thread.  Normally, this method is invoked at
115     * most once per thread, but it may be invoked again in case of
116     * subsequent invocations of {@link #remove} followed by {@link #get}.
117     *
118     * <p>This implementation simply returns {@code null}; if the
119     * programmer desires thread-local variables to have an initial
120     * value other than {@code null}, {@code ThreadLocal} must be
121     * subclassed, and this method overridden.  Typically, an
122     * anonymous inner class will be used.
123     *
124     * @return the initial value for this thread-local
125     */
126    protected T initialValue() {
127        return null;
128    }
129
130    /**
131     * Creates a thread local variable. The initial value of the variable is
132     * determined by invoking the {@code get} method on the {@code Supplier}.
133     *
134     * @param <S> the type of the thread local's value
135     * @param supplier the supplier to be used to determine the initial value
136     * @return a new thread local variable
137     * @throws NullPointerException if the specified supplier is null
138     * @since 1.8
139     */
140    public static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier) {
141        return new SuppliedThreadLocal<>(supplier);
142    }
143
144    /**
145     * Creates a thread local variable.
146     * @see #withInitial(java.util.function.Supplier)
147     */
148    public ThreadLocal() {
149    }
150
151    /**
152     * Returns the value in the current thread's copy of this
153     * thread-local variable.  If the variable has no value for the
154     * current thread, it is first initialized to the value returned
155     * by an invocation of the {@link #initialValue} method.
156     *
157     * @return the current thread's value of this thread-local
158     */
159    public T get() {
160        Thread t = Thread.currentThread();
161        ThreadLocalMap map = getMap(t);
162        if (map != null) {
163            ThreadLocalMap.Entry e = map.getEntry(this);
164            if (e != null) {
165                @SuppressWarnings("unchecked")
166                T result = (T)e.value;
167                return result;
168            }
169        }
170        return setInitialValue();
171    }
172
173    /**
174     * Variant of set() to establish initialValue. Used instead
175     * of set() in case user has overridden the set() method.
176     *
177     * @return the initial value
178     */
179    private T setInitialValue() {
180        T value = initialValue();
181        Thread t = Thread.currentThread();
182        ThreadLocalMap map = getMap(t);
183        if (map != null)
184            map.set(this, value);
185        else
186            createMap(t, value);
187        return value;
188    }
189
190    /**
191     * Sets the current thread's copy of this thread-local variable
192     * to the specified value.  Most subclasses will have no need to
193     * override this method, relying solely on the {@link #initialValue}
194     * method to set the values of thread-locals.
195     *
196     * @param value the value to be stored in the current thread's copy of
197     *        this thread-local.
198     */
199    public void set(T value) {
200        Thread t = Thread.currentThread();
201        ThreadLocalMap map = getMap(t);
202        if (map != null)
203            map.set(this, value);
204        else
205            createMap(t, value);
206    }
207
208    /**
209     * Removes the current thread's value for this thread-local
210     * variable.  If this thread-local variable is subsequently
211     * {@linkplain #get read} by the current thread, its value will be
212     * reinitialized by invoking its {@link #initialValue} method,
213     * unless its value is {@linkplain #set set} by the current thread
214     * in the interim.  This may result in multiple invocations of the
215     * {@code initialValue} method in the current thread.
216     *
217     * @since 1.5
218     */
219     public void remove() {
220         ThreadLocalMap m = getMap(Thread.currentThread());
221         if (m != null)
222             m.remove(this);
223     }
224
225    /**
226     * Get the map associated with a ThreadLocal. Overridden in
227     * InheritableThreadLocal.
228     *
229     * @param  t the current thread
230     * @return the map
231     */
232    ThreadLocalMap getMap(Thread t) {
233        return t.threadLocals;
234    }
235
236    /**
237     * Create the map associated with a ThreadLocal. Overridden in
238     * InheritableThreadLocal.
239     *
240     * @param t the current thread
241     * @param firstValue value for the initial entry of the map
242     */
243    void createMap(Thread t, T firstValue) {
244        t.threadLocals = new ThreadLocalMap(this, firstValue);
245    }
246
247    /**
248     * Factory method to create map of inherited thread locals.
249     * Designed to be called only from Thread constructor.
250     *
251     * @param  parentMap the map associated with parent thread
252     * @return a map containing the parent's inheritable bindings
253     */
254    static ThreadLocalMap createInheritedMap(ThreadLocalMap parentMap) {
255        return new ThreadLocalMap(parentMap);
256    }
257
258    /**
259     * Method childValue is visibly defined in subclass
260     * InheritableThreadLocal, but is internally defined here for the
261     * sake of providing createInheritedMap factory method without
262     * needing to subclass the map class in InheritableThreadLocal.
263     * This technique is preferable to the alternative of embedding
264     * instanceof tests in methods.
265     */
266    T childValue(T parentValue) {
267        throw new UnsupportedOperationException();
268    }
269
270    /**
271     * An extension of ThreadLocal that obtains its initial value from
272     * the specified {@code Supplier}.
273     */
274    static final class SuppliedThreadLocal<T> extends ThreadLocal<T> {
275
276        private final Supplier<? extends T> supplier;
277
278        SuppliedThreadLocal(Supplier<? extends T> supplier) {
279            this.supplier = Objects.requireNonNull(supplier);
280        }
281
282        @Override
283        protected T initialValue() {
284            return supplier.get();
285        }
286    }
287
288    /**
289     * ThreadLocalMap is a customized hash map suitable only for
290     * maintaining thread local values. No operations are exported
291     * outside of the ThreadLocal class. The class is package private to
292     * allow declaration of fields in class Thread.  To help deal with
293     * very large and long-lived usages, the hash table entries use
294     * WeakReferences for keys. However, since reference queues are not
295     * used, stale entries are guaranteed to be removed only when
296     * the table starts running out of space.
297     */
298    static class ThreadLocalMap {
299
300        /**
301         * The entries in this hash map extend WeakReference, using
302         * its main ref field as the key (which is always a
303         * ThreadLocal object).  Note that null keys (i.e. entry.get()
304         * == null) mean that the key is no longer referenced, so the
305         * entry can be expunged from table.  Such entries are referred to
306         * as "stale entries" in the code that follows.
307         */
308        static class Entry extends WeakReference<ThreadLocal<?>> {
309            /** The value associated with this ThreadLocal. */
310            Object value;
311
312            Entry(ThreadLocal<?> k, Object v) {
313                super(k);
314                value = v;
315            }
316        }
317
318        /**
319         * The initial capacity -- MUST be a power of two.
320         */
321        private static final int INITIAL_CAPACITY = 16;
322
323        /**
324         * The table, resized as necessary.
325         * table.length MUST always be a power of two.
326         */
327        private Entry[] table;
328
329        /**
330         * The number of entries in the table.
331         */
332        private int size = 0;
333
334        /**
335         * The next size value at which to resize.
336         */
337        private int threshold; // Default to 0
338
339        /**
340         * Set the resize threshold to maintain at worst a 2/3 load factor.
341         */
342        private void setThreshold(int len) {
343            threshold = len * 2 / 3;
344        }
345
346        /**
347         * Increment i modulo len.
348         */
349        private static int nextIndex(int i, int len) {
350            return ((i + 1 < len) ? i + 1 : 0);
351        }
352
353        /**
354         * Decrement i modulo len.
355         */
356        private static int prevIndex(int i, int len) {
357            return ((i - 1 >= 0) ? i - 1 : len - 1);
358        }
359
360        /**
361         * Construct a new map initially containing (firstKey, firstValue).
362         * ThreadLocalMaps are constructed lazily, so we only create
363         * one when we have at least one entry to put in it.
364         */
365        ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
366            table = new Entry[INITIAL_CAPACITY];
367            int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
368            table[i] = new Entry(firstKey, firstValue);
369            size = 1;
370            setThreshold(INITIAL_CAPACITY);
371        }
372
373        /**
374         * Construct a new map including all Inheritable ThreadLocals
375         * from given parent map. Called only by createInheritedMap.
376         *
377         * @param parentMap the map associated with parent thread.
378         */
379        private ThreadLocalMap(ThreadLocalMap parentMap) {
380            Entry[] parentTable = parentMap.table;
381            int len = parentTable.length;
382            setThreshold(len);
383            table = new Entry[len];
384
385            for (int j = 0; j < len; j++) {
386                Entry e = parentTable[j];
387                if (e != null) {
388                    @SuppressWarnings("unchecked")
389                    ThreadLocal<Object> key = (ThreadLocal<Object>) e.get();
390                    if (key != null) {
391                        Object value = key.childValue(e.value);
392                        Entry c = new Entry(key, value);
393                        int h = key.threadLocalHashCode & (len - 1);
394                        while (table[h] != null)
395                            h = nextIndex(h, len);
396                        table[h] = c;
397                        size++;
398                    }
399                }
400            }
401        }
402
403        /**
404         * Get the entry associated with key.  This method
405         * itself handles only the fast path: a direct hit of existing
406         * key. It otherwise relays to getEntryAfterMiss.  This is
407         * designed to maximize performance for direct hits, in part
408         * by making this method readily inlinable.
409         *
410         * @param  key the thread local object
411         * @return the entry associated with key, or null if no such
412         */
413        private Entry getEntry(ThreadLocal<?> key) {
414            int i = key.threadLocalHashCode & (table.length - 1);
415            Entry e = table[i];
416            if (e != null && e.get() == key)
417                return e;
418            else
419                return getEntryAfterMiss(key, i, e);
420        }
421
422        /**
423         * Version of getEntry method for use when key is not found in
424         * its direct hash slot.
425         *
426         * @param  key the thread local object
427         * @param  i the table index for key's hash code
428         * @param  e the entry at table[i]
429         * @return the entry associated with key, or null if no such
430         */
431        private Entry getEntryAfterMiss(ThreadLocal<?> key, int i, Entry e) {
432            Entry[] tab = table;
433            int len = tab.length;
434
435            while (e != null) {
436                ThreadLocal<?> k = e.get();
437                if (k == key)
438                    return e;
439                if (k == null)
440                    expungeStaleEntry(i);
441                else
442                    i = nextIndex(i, len);
443                e = tab[i];
444            }
445            return null;
446        }
447
448        /**
449         * Set the value associated with key.
450         *
451         * @param key the thread local object
452         * @param value the value to be set
453         */
454        private void set(ThreadLocal<?> key, Object value) {
455
456            // We don't use a fast path as with get() because it is at
457            // least as common to use set() to create new entries as
458            // it is to replace existing ones, in which case, a fast
459            // path would fail more often than not.
460
461            Entry[] tab = table;
462            int len = tab.length;
463            int i = key.threadLocalHashCode & (len-1);
464
465            for (Entry e = tab[i];
466                 e != null;
467                 e = tab[i = nextIndex(i, len)]) {
468                ThreadLocal<?> k = e.get();
469
470                if (k == key) {
471                    e.value = value;
472                    return;
473                }
474
475                if (k == null) {
476                    replaceStaleEntry(key, value, i);
477                    return;
478                }
479            }
480
481            tab[i] = new Entry(key, value);
482            int sz = ++size;
483            if (!cleanSomeSlots(i, sz) && sz >= threshold)
484                rehash();
485        }
486
487        /**
488         * Remove the entry for key.
489         */
490        private void remove(ThreadLocal<?> key) {
491            Entry[] tab = table;
492            int len = tab.length;
493            int i = key.threadLocalHashCode & (len-1);
494            for (Entry e = tab[i];
495                 e != null;
496                 e = tab[i = nextIndex(i, len)]) {
497                if (e.get() == key) {
498                    e.clear();
499                    expungeStaleEntry(i);
500                    return;
501                }
502            }
503        }
504
505        /**
506         * Replace a stale entry encountered during a set operation
507         * with an entry for the specified key.  The value passed in
508         * the value parameter is stored in the entry, whether or not
509         * an entry already exists for the specified key.
510         *
511         * As a side effect, this method expunges all stale entries in the
512         * "run" containing the stale entry.  (A run is a sequence of entries
513         * between two null slots.)
514         *
515         * @param  key the key
516         * @param  value the value to be associated with key
517         * @param  staleSlot index of the first stale entry encountered while
518         *         searching for key.
519         */
520        private void replaceStaleEntry(ThreadLocal<?> key, Object value,
521                                       int staleSlot) {
522            Entry[] tab = table;
523            int len = tab.length;
524            Entry e;
525
526            // Back up to check for prior stale entry in current run.
527            // We clean out whole runs at a time to avoid continual
528            // incremental rehashing due to garbage collector freeing
529            // up refs in bunches (i.e., whenever the collector runs).
530            int slotToExpunge = staleSlot;
531            for (int i = prevIndex(staleSlot, len);
532                 (e = tab[i]) != null;
533                 i = prevIndex(i, len))
534                if (e.get() == null)
535                    slotToExpunge = i;
536
537            // Find either the key or trailing null slot of run, whichever
538            // occurs first
539            for (int i = nextIndex(staleSlot, len);
540                 (e = tab[i]) != null;
541                 i = nextIndex(i, len)) {
542                ThreadLocal<?> k = e.get();
543
544                // If we find key, then we need to swap it
545                // with the stale entry to maintain hash table order.
546                // The newly stale slot, or any other stale slot
547                // encountered above it, can then be sent to expungeStaleEntry
548                // to remove or rehash all of the other entries in run.
549                if (k == key) {
550                    e.value = value;
551
552                    tab[i] = tab[staleSlot];
553                    tab[staleSlot] = e;
554
555                    // Start expunge at preceding stale entry if it exists
556                    if (slotToExpunge == staleSlot)
557                        slotToExpunge = i;
558                    cleanSomeSlots(expungeStaleEntry(slotToExpunge), len);
559                    return;
560                }
561
562                // If we didn't find stale entry on backward scan, the
563                // first stale entry seen while scanning for key is the
564                // first still present in the run.
565                if (k == null && slotToExpunge == staleSlot)
566                    slotToExpunge = i;
567            }
568
569            // If key not found, put new entry in stale slot
570            tab[staleSlot].value = null;
571            tab[staleSlot] = new Entry(key, value);
572
573            // If there are any other stale entries in run, expunge them
574            if (slotToExpunge != staleSlot)
575                cleanSomeSlots(expungeStaleEntry(slotToExpunge), len);
576        }
577
578        /**
579         * Expunge a stale entry by rehashing any possibly colliding entries
580         * lying between staleSlot and the next null slot.  This also expunges
581         * any other stale entries encountered before the trailing null.  See
582         * Knuth, Section 6.4
583         *
584         * @param staleSlot index of slot known to have null key
585         * @return the index of the next null slot after staleSlot
586         * (all between staleSlot and this slot will have been checked
587         * for expunging).
588         */
589        private int expungeStaleEntry(int staleSlot) {
590            Entry[] tab = table;
591            int len = tab.length;
592
593            // expunge entry at staleSlot
594            tab[staleSlot].value = null;
595            tab[staleSlot] = null;
596            size--;
597
598            // Rehash until we encounter null
599            Entry e;
600            int i;
601            for (i = nextIndex(staleSlot, len);
602                 (e = tab[i]) != null;
603                 i = nextIndex(i, len)) {
604                ThreadLocal<?> k = e.get();
605                if (k == null) {
606                    e.value = null;
607                    tab[i] = null;
608                    size--;
609                } else {
610                    int h = k.threadLocalHashCode & (len - 1);
611                    if (h != i) {
612                        tab[i] = null;
613
614                        // Unlike Knuth 6.4 Algorithm R, we must scan until
615                        // null because multiple entries could have been stale.
616                        while (tab[h] != null)
617                            h = nextIndex(h, len);
618                        tab[h] = e;
619                    }
620                }
621            }
622            return i;
623        }
624
625        /**
626         * Heuristically scan some cells looking for stale entries.
627         * This is invoked when either a new element is added, or
628         * another stale one has been expunged. It performs a
629         * logarithmic number of scans, as a balance between no
630         * scanning (fast but retains garbage) and a number of scans
631         * proportional to number of elements, that would find all
632         * garbage but would cause some insertions to take O(n) time.
633         *
634         * @param i a position known NOT to hold a stale entry. The
635         * scan starts at the element after i.
636         *
637         * @param n scan control: {@code log2(n)} cells are scanned,
638         * unless a stale entry is found, in which case
639         * {@code log2(table.length)-1} additional cells are scanned.
640         * When called from insertions, this parameter is the number
641         * of elements, but when from replaceStaleEntry, it is the
642         * table length. (Note: all this could be changed to be either
643         * more or less aggressive by weighting n instead of just
644         * using straight log n. But this version is simple, fast, and
645         * seems to work well.)
646         *
647         * @return true if any stale entries have been removed.
648         */
649        private boolean cleanSomeSlots(int i, int n) {
650            boolean removed = false;
651            Entry[] tab = table;
652            int len = tab.length;
653            do {
654                i = nextIndex(i, len);
655                Entry e = tab[i];
656                if (e != null && e.get() == null) {
657                    n = len;
658                    removed = true;
659                    i = expungeStaleEntry(i);
660                }
661            } while ( (n >>>= 1) != 0);
662            return removed;
663        }
664
665        /**
666         * Re-pack and/or re-size the table. First scan the entire
667         * table removing stale entries. If this doesn't sufficiently
668         * shrink the size of the table, double the table size.
669         */
670        private void rehash() {
671            expungeStaleEntries();
672
673            // Use lower threshold for doubling to avoid hysteresis
674            if (size >= threshold - threshold / 4)
675                resize();
676        }
677
678        /**
679         * Double the capacity of the table.
680         */
681        private void resize() {
682            Entry[] oldTab = table;
683            int oldLen = oldTab.length;
684            int newLen = oldLen * 2;
685            Entry[] newTab = new Entry[newLen];
686            int count = 0;
687
688            for (int j = 0; j < oldLen; ++j) {
689                Entry e = oldTab[j];
690                if (e != null) {
691                    ThreadLocal<?> k = e.get();
692                    if (k == null) {
693                        e.value = null; // Help the GC
694                    } else {
695                        int h = k.threadLocalHashCode & (newLen - 1);
696                        while (newTab[h] != null)
697                            h = nextIndex(h, newLen);
698                        newTab[h] = e;
699                        count++;
700                    }
701                }
702            }
703
704            setThreshold(newLen);
705            size = count;
706            table = newTab;
707        }
708
709        /**
710         * Expunge all stale entries in the table.
711         */
712        private void expungeStaleEntries() {
713            Entry[] tab = table;
714            int len = tab.length;
715            for (int j = 0; j < len; j++) {
716                Entry e = tab[j];
717                if (e != null && e.get() == null)
718                    expungeStaleEntry(j);
719            }
720        }
721    }
722}
723