source: trunk/gcc/libjava/java/lang/ThreadLocal.java

Last change on this file was 1392, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.9 KB
Line 
1/* ThreadLocal -- a variable with a unique value per thread
2 Copyright (C) 2000, 2002 Free Software Foundation, Inc.
3
4This file is part of GNU Classpath.
5
6GNU Classpath is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Classpath is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Classpath; see the file COPYING. If not, write to the
18Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
1902111-1307 USA.
20
21Linking this library statically or dynamically with other modules is
22making a combined work based on this library. Thus, the terms and
23conditions of the GNU General Public License cover the whole
24combination.
25
26As a special exception, the copyright holders of this library give you
27permission to link this library with independent modules to produce an
28executable, regardless of the license terms of these independent
29modules, and to copy and distribute the resulting executable under
30terms of your choice, provided that you also meet, for each linked
31independent module, the terms and conditions of the license of that
32module. An independent module is a module which is not derived from
33or based on this library. If you modify this library, you may extend
34this exception to your version of the library, but you are not
35obligated to do so. If you do not wish to do so, delete this
36exception statement from your version. */
37
38package java.lang;
39
40import java.util.Map;
41import java.util.WeakHashMap;
42
43/**
44 * ThreadLocal objects have a different state associated with every
45 * Thread that accesses them. Every access to the ThreadLocal object
46 * (through the <code>get()</code> and <code>set()</code> methods)
47 * only affects the state of the object as seen by the currently
48 * executing Thread.
49 *
50 * <p>The first time a ThreadLocal object is accessed on a particular
51 * Thread, the state for that Thread's copy of the local variable is set by
52 * executing the method <code>initialValue()</code>.
53 *
54 * <p>An example how you can use this:
55 * <pre>
56 * class Connection
57 * {
58 * private static ThreadLocal owner = new ThreadLocal()
59 * {
60 * public Object initialValue()
61 * {
62 * return("nobody");
63 * }
64 * };
65 * ...
66 * }
67 * </pre></br>
68 *
69 * Now all instances of connection can see who the owner of the currently
70 * executing Thread is by calling <code>owner.get()</code>. By default any
71 * Thread would be associated with 'nobody'. But the Connection object could
72 * offer a method that changes the owner associated with the Thread on
73 * which the method was called by calling <code>owner.put("somebody")</code>.
74 * (Such an owner changing method should then be guarded by security checks.)
75 *
76 * <p>When a Thread is garbage collected all references to values of
77 * the ThreadLocal objects associated with that Thread are removed.
78 *
79 * @author Mark Wielaard <mark@klomp.org>
80 * @author Eric Blake <ebb9@email.byu.edu>
81 * @since 1.2
82 * @status updated to 1.4
83 */
84public class ThreadLocal
85{
86 /**
87 * Placeholder to distinguish between uninitialized and null set by the
88 * user. Do not expose this to the public. Package visible for use by
89 * InheritableThreadLocal
90 */
91 static final Object NULL = new Object();
92
93 /**
94 * The stored value. Package visible for use by InheritableThreadLocal. */
95 Object value;
96
97 /**
98 * Maps Threads to values. Uses a WeakHashMap so if a Thread is garbage
99 * collected the reference to the Value will disappear. A null value means
100 * uninitialized, while NULL means a user-specified null. Only the
101 * <code>set(Thread, Object)</code> and <code>get(Thread)</code> methods
102 * access it. Package visible for use by InheritableThreadLocal.
103 */
104 final Map valueMap = new WeakHashMap();
105
106 /**
107 * Creates a ThreadLocal object without associating any value to it yet.
108 */
109 public ThreadLocal()
110 {
111 }
112
113 /**
114 * Called once per thread on the first invocation of get(), if set() was
115 * not already called. The default implementation returns <code>null</code>.
116 * Often, this method is overridden to create the appropriate initial object
117 * for the current thread's view of the ThreadLocal.
118 *
119 * @return the initial value of the variable in this thread
120 */
121 protected Object initialValue()
122 {
123 return null;
124 }
125
126 /**
127 * Gets the value associated with the ThreadLocal object for the currently
128 * executing Thread. If this is the first time the current thread has called
129 * get(), and it has not already called set(), the value is obtained by
130 * <code>initialValue()</code>.
131 *
132 * @return the value of the variable in this thread
133 */
134 public Object get()
135 {
136 Thread currentThread = Thread.currentThread();
137 // Note that we don't have to synchronize, as only this thread will
138 // ever modify the returned value.
139 Object value = valueMap.get(currentThread);
140 if (value == null)
141 {
142 value = initialValue();
143 valueMap.put(currentThread, value == null ? NULL : value);
144 }
145 return value == NULL ? null : value;
146 }
147
148 /**
149 * Sets the value associated with the ThreadLocal object for the currently
150 * executing Thread. This overrides any existing value associated with the
151 * current Thread and prevents <code>initialValue()</code> from being
152 * called if this is the first access to this ThreadLocal in this Thread.
153 *
154 * @param value the value to set this thread's view of the variable to
155 */
156 public void set(Object value)
157 {
158 // Note that we don't have to synchronize, as only this thread will
159 // ever modify the returned value.
160 valueMap.put(Thread.currentThread(), value == null ? NULL : value);
161 }
162}
Note: See TracBrowser for help on using the repository browser.