ThreadLocal is used to create thread-scope variables.
ThreadLocal class is used for creating thread-local variables which can only be read and written by the same thread.
Thus, even if two threads are executing the same code, and the code has a reference to the same ThreadLocal variable, the two threads cannot see each other’s ThreadLocal variables.
Creating a ThreadLocal
private ThreadLocal threadLocal = new ThreadLocal();
You can use Generics like the below:
private ThreadLocal<String> myThreadLocal = new ThreadLocal<String>();
Setting a Value to ThreadLocal
threadLocal.set(“some value”);
Get the ThreadLocal Value
String threadLocalValue = threadLocal.get();
Initializing the ThreadLocal Value
It is possible to set an initial value for a Java ThreadLocal which will get used the first time get() is called – before set() has been called with a new value.
// Initialize the thread local variable
@Override protected String initialValue() {
return “Initial Value”;
}
};
package com.java.example;
public class ThreadLocalExample extends Thread{
public static void main(String[] args) throws InterruptedException {
Runnable sharedRunnableInstance=new Runnable(){
private String str = "";
private ThreadLocal<String> threadLocal = new ThreadLocal<String>() {
// Initialize the thread local variable
@Override protected String initialValue() {
return "Thread Local Variable";
}
};
@Override
public void run() {
//thread local variable is set
threadLocal.set(Thread.currentThread().getName());
//str variable is also set
str=Thread.currentThread().getName();
try {
//Goes to sleep for 1000 ms
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// Reading both the thread local and str variable
System.out.println("Thread Local Value:"+threadLocal.get());
System.out.println("String value:"+str);
}
};
Thread thread1 = new Thread(sharedRunnableInstance);
thread1.setName("First Thread");
Thread thread2 = new Thread(sharedRunnableInstance);
thread2.setName("Second Thread");
thread1.start();
thread2.start();
thread1.join(); //wait for thread 1 to terminate
thread2.join(); //wait for thread 2 to terminate
}
}
Thread Local Value:First Thread
String value:Second Thread
Thread Local Value:Second Thread
String value:Second Thread
In the above code, sharedRunnableInstance instance which is passed to two different threads.
Both threads execute the run() method, and thus sets different values on the ThreadLocal instance variable “threadLocal” and also to the String variable “str”.
However, since it is a ThreadLocal variable, the two threads cannot see each other’s values. Thus, they set and get different values.
However, the variable “str” is shared across the threads. For that reason, when the first thread wakes up from sleep, “str” is already updated by second thread.