1 /* 2 * Copyright (c) 1998, 2012, 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 26 package java.lang; 27 import java.lang.ref.*; 28 29 /** 30 * This class extends <tt>ThreadLocal</tt> to provide inheritance of values 31 * from parent thread to child thread: when a child thread is created, the 32 * child receives initial values for all inheritable thread-local variables 33 * for which the parent has values. Normally the child's values will be 34 * identical to the parent's; however, the child's value can be made an 35 * arbitrary function of the parent's by overriding the <tt>childValue</tt> 36 * method in this class. 37 * 38 * <p>Inheritable thread-local variables are used in preference to 39 * ordinary thread-local variables when the per-thread-attribute being 40 * maintained in the variable (e.g., User ID, Transaction ID) must be 41 * automatically transmitted to any child threads that are created. 42 * 43 * @author Josh Bloch and Doug Lea 44 * @see ThreadLocal 45 * @since 1.2 46 */ 47 48 public class InheritableThreadLocal<T> extends ThreadLocal<T> { 49 /** 50 * Computes the child's initial value for this inheritable thread-local 51 * variable as a function of the parent's value at the time the child 52 * thread is created. This method is called from within the parent 53 * thread before the child is started. 54 * <p> 55 * This method merely returns its input argument, and should be overridden 56 * if a different behavior is desired. 57 * 58 * @param parentValue the parent thread's value 59 * @return the child thread's initial value 60 */ childValue(T parentValue)61 protected T childValue(T parentValue) { 62 return parentValue; 63 } 64 65 /** 66 * Get the map associated with a ThreadLocal. 67 * 68 * @param t the current thread 69 */ getMap(Thread t)70 ThreadLocalMap getMap(Thread t) { 71 return t.inheritableThreadLocals; 72 } 73 74 /** 75 * Create the map associated with a ThreadLocal. 76 * 77 * @param t the current thread 78 * @param firstValue value for the initial entry of the table. 79 */ createMap(Thread t, T firstValue)80 void createMap(Thread t, T firstValue) { 81 t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue); 82 } 83 } 84