# ThreadLocal

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  
Summary:[Ctors](https://developer.android.com/reference/java/lang/ThreadLocal#pubctors)\|[Methods](https://developer.android.com/reference/java/lang/ThreadLocal#pubmethods)\|[Protected Methods](https://developer.android.com/reference/java/lang/ThreadLocal#promethods)\|[Inherited Methods](https://developer.android.com/reference/java/lang/ThreadLocal#inhmethods)  

# ThreadLocal

`
public


class
ThreadLocal
`  
`

extends `[Object](https://developer.android.com/reference/java/lang/Object)`


``


`

|---|----------------------------|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | java.lang.ThreadLocal\<T\> |

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Known direct subclasses [InheritableThreadLocal](https://developer.android.com/reference/java/lang/InheritableThreadLocal)\<T\> |---------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [InheritableThreadLocal](https://developer.android.com/reference/java/lang/InheritableThreadLocal)\<T\> | This class extends`ThreadLocal`to provide inheritance of values from parent thread to child thread: when a child thread is created, the child receives initial values for all inheritable thread-local variables for which the parent has values. | |

<br />

*** ** * ** ***

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its`get`or`set`method) has its own, independently initialized copy of the variable.`ThreadLocal`instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

For example, the class below generates unique identifiers local to each thread. A thread's id is assigned the first time it invokes`ThreadId.get()`and remains unchanged on subsequent calls.  

```
 import java.util.concurrent.atomic.AtomicInteger;

 public class ThreadId {
     // Atomic integer containing the next thread ID to be assigned
     private static final AtomicInteger nextId = new AtomicInteger(0);

     // Thread local variable containing each thread's ID
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };

     // Returns the current thread's unique ID, assigning it if necessary
     public static int get() {
         return threadId.get();
     }
 }
 
```

Each thread holds an implicit reference to its copy of a thread-local variable as long as the thread is alive and the`ThreadLocal`instance is accessible; after a thread goes away, all of its copies of thread-local instances are subject to garbage collection (unless other references to these copies exist).

## Summary

|                                                        ### Public constructors                                                         ||
|-------------------------------------------------------------------------------------------------------------------------------------|---|
| ` `[ThreadLocal](https://developer.android.com/reference/java/lang/ThreadLocal#ThreadLocal())`() ` Creates a thread local variable. |

|                                                                                                                                                                                   ### Public methods                                                                                                                                                                                    ||
|-------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ` T`                                                                                            | ` `[get](https://developer.android.com/reference/java/lang/ThreadLocal#get())`() ` Returns the value in the current thread's copy of this thread-local variable.                                                                                                                       |
| ` void`                                                                                         | ` `[remove](https://developer.android.com/reference/java/lang/ThreadLocal#remove())`() ` Removes the current thread's value for this thread-local variable.                                                                                                                            |
| ` void`                                                                                         | ` `[set](https://developer.android.com/reference/java/lang/ThreadLocal#set(T))`(T value) ` Sets the current thread's copy of this thread-local variable to the specified value.                                                                                                        |
| ` static <S> `[ThreadLocal](https://developer.android.com/reference/java/lang/ThreadLocal)`<S>` | ` `[withInitial](https://developer.android.com/reference/java/lang/ThreadLocal#withInitial(java.util.function.Supplier<?%20extends%20S>))`(`[Supplier](https://developer.android.com/reference/java/util/function/Supplier)`<? extends S> supplier) ` Creates a thread local variable. |

|                                                                                  ### Protected methods                                                                                  ||
|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ` T` | ` `[initialValue](https://developer.android.com/reference/java/lang/ThreadLocal#initialValue())`() ` Returns the current thread's "initial value" for this thread-local variable. |

| ### Inherited methods |
|-----------------------|---|
| From class` `[java.lang.Object](https://developer.android.com/reference/java/lang/Object)` ` |--------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ` `[Object](https://developer.android.com/reference/java/lang/Object)          | ` `[clone](https://developer.android.com/reference/java/lang/Object#clone())`() ` Creates and returns a copy of this object.                                                                                                                                                      | | ` boolean`                                                                     | ` `[equals](https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object))`(`[Object](https://developer.android.com/reference/java/lang/Object)` obj) ` Indicates whether some other object is "equal to" this one.                                           | | ` void`                                                                        | ` `[finalize](https://developer.android.com/reference/java/lang/Object#finalize())`() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.                                                          | | ` final `[Class](https://developer.android.com/reference/java/lang/Class)`<?>` | ` `[getClass](https://developer.android.com/reference/java/lang/Object#getClass())`() ` Returns the runtime class of this`Object`.                                                                                                                                                | | ` int`                                                                         | ` `[hashCode](https://developer.android.com/reference/java/lang/Object#hashCode())`() ` Returns a hash code value for the object.                                                                                                                                                 | | ` final void`                                                                  | ` `[notify](https://developer.android.com/reference/java/lang/Object#notify())`() ` Wakes up a single thread that is waiting on this object's monitor.                                                                                                                            | | ` final void`                                                                  | ` `[notifyAll](https://developer.android.com/reference/java/lang/Object#notifyAll())`() ` Wakes up all threads that are waiting on this object's monitor.                                                                                                                         | | ` `[String](https://developer.android.com/reference/java/lang/String)          | ` `[toString](https://developer.android.com/reference/java/lang/Object#toString())`() ` Returns a string representation of the object.                                                                                                                                            | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait(long,%20int))`(long timeoutMillis, int nanos) ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*, or until a certain amount of real time has elapsed. | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait(long))`(long timeoutMillis) ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*, or until a certain amount of real time has elapsed.                   | | ` final void`                                                                  | ` `[wait](https://developer.android.com/reference/java/lang/Object#wait())`() ` Causes the current thread to wait until it is awakened, typically by being*notified* or*interrupted*.                                                                                             | ||

## Public constructors

### ThreadLocal

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public ThreadLocal ()
```

Creates a thread local variable.

<br />

**See also:**

- [withInitial(java.util.function.Supplier)](https://developer.android.com/reference/java/lang/ThreadLocal#withInitial(java.util.function.Supplier<?%20extends%20S>))

## Public methods

### get

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public T get ()
```

Returns the value in the current thread's copy of this thread-local variable. If the variable has no value for the current thread, it is first initialized to the value returned by an invocation of the[initialValue()](https://developer.android.com/reference/java/lang/ThreadLocal#initialValue())method.

<br />

|                           Returns                           ||
|-----|--------------------------------------------------------|
| `T` | the current thread's value of this thread-local <br /> |

### remove

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public void remove ()
```

Removes the current thread's value for this thread-local variable. If this thread-local variable is subsequently[read](https://developer.android.com/reference/java/lang/ThreadLocal#get())by the current thread, its value will be reinitialized by invoking its[initialValue()](https://developer.android.com/reference/java/lang/ThreadLocal#initialValue())method, unless its value is[set](https://developer.android.com/reference/java/lang/ThreadLocal#set(T))by the current thread in the interim. This may result in multiple invocations of the`initialValue`method in the current thread.

<br />

### set

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public void set (T value)
```

Sets the current thread's copy of this thread-local variable to the specified value. Most subclasses will have no need to override this method, relying solely on the[initialValue()](https://developer.android.com/reference/java/lang/ThreadLocal#initialValue())method to set the values of thread-locals.

<br />

|                                           Parameters                                           ||
|---------|---------------------------------------------------------------------------------------|
| `value` | `T`: the value to be stored in the current thread's copy of this thread-local. <br /> |

### withInitial

Added in[API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
public static ThreadLocal<S> withInitial (Supplier<? extends S> supplier)
```

Creates a thread local variable. The initial value of the variable is determined by invoking the`get`method on the`Supplier`.

<br />

|                                      Parameters                                       ||
|------------|---------------------------------------------------------------------------|
| `supplier` | `Supplier`: the supplier to be used to determine the initial value <br /> |

|                                                        Returns                                                        ||
|-----------------------------------------------------------------------------------|------------------------------------|
| [ThreadLocal](https://developer.android.com/reference/java/lang/ThreadLocal)`<S>` | a new thread local variable <br /> |

|                                                              Throws                                                               ||
|------------------------------------------------------------------------------------------------|-----------------------------------|
| [NullPointerException](https://developer.android.com/reference/java/lang/NullPointerException) | if the specified supplier is null |

## Protected methods

### initialValue

Added in[API level 1](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)  

```
protected T initialValue ()
```

Returns the current thread's "initial value" for this thread-local variable. This method will be invoked the first time a thread accesses the variable with the[get()](https://developer.android.com/reference/java/lang/ThreadLocal#get())method, unless the thread previously invoked the[set(T)](https://developer.android.com/reference/java/lang/ThreadLocal#set(T))method, in which case the`initialValue`method will not be invoked for the thread. Normally, this method is invoked at most once per thread, but it may be invoked again in case of subsequent invocations of[remove()](https://developer.android.com/reference/java/lang/ThreadLocal#remove())followed by[get()](https://developer.android.com/reference/java/lang/ThreadLocal#get()).

<br />

##### Implementation Requirements:

- This implementation simply returns`null`; if the programmer desires thread-local variables to have an initial value other than`null`, then either`ThreadLocal`can be subclassed and this method overridden or the method[ThreadLocal.withInitial(Supplier)](https://developer.android.com/reference/java/lang/ThreadLocal#withInitial(java.util.function.Supplier<?%20extends%20S>))can be used to construct a`ThreadLocal`.

|                       Returns                       ||
|-----|------------------------------------------------|
| `T` | the initial value for this thread-local <br /> |

**See also:**

- [withInitial(java.util.function.Supplier)](https://developer.android.com/reference/java/lang/ThreadLocal#withInitial(java.util.function.Supplier<?%20extends%20S>))