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 {@code ThreadLocal} 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 {@code childValue} 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 * <p>Note: During the creation of a new {@link 44 * Thread#Thread(ThreadGroup,Runnable,String,long,boolean) thread}, it is 45 * possible to <i>opt out</i> of receiving initial values for inheritable 46 * thread-local variables. 47 * 48 * @author Josh Bloch and Doug Lea 49 * @see ThreadLocal 50 * @since 1.2 51 */ 52 53 public class InheritableThreadLocal<T> extends ThreadLocal<T> { 54 /** 55 * Computes the child's initial value for this inheritable thread-local 56 * variable as a function of the parent's value at the time the child 57 * thread is created. This method is called from within the parent 58 * thread before the child is started. 59 * <p> 60 * This method merely returns its input argument, and should be overridden 61 * if a different behavior is desired. 62 * 63 * @param parentValue the parent thread's value 64 * @return the child thread's initial value 65 */ childValue(T parentValue)66 protected T childValue(T parentValue) { 67 return parentValue; 68 } 69 70 /** 71 * Get the map associated with a ThreadLocal. 72 * 73 * @param t the current thread 74 */ getMap(Thread t)75 ThreadLocalMap getMap(Thread t) { 76 return t.inheritableThreadLocals; 77 } 78 79 /** 80 * Create the map associated with a ThreadLocal. 81 * 82 * @param t the current thread 83 * @param firstValue value for the initial entry of the table. 84 */ createMap(Thread t, T firstValue)85 void createMap(Thread t, T firstValue) { 86 t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue); 87 } 88 } 89