Knowing SecurityContextHolder using ThreadLocal to store user related information. Meaning it does not use HttpSession due to some security concern (not discuss here). Wrote a main method to test that out.
public class NormalThreadExample { public class MyThread implements Runnable { private Integer normalInteger; @Override public void run() { try { Integer randomInt = (int) (Math.random() * 999); System.out.println(Thread.currentThread().getName() + " SET " + randomInt); normalInteger = randomInt; Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " GET " + normalInteger); } catch (InterruptedException ex) { // SOME HANDLER } } } public void haveFun() throws InterruptedException{ MyThread myThread = new MyThread(); Thread thread1 = new Thread(myThread); Thread thread2 = new Thread(myThread); thread1.start(); thread2.start(); } public static void main(String[] args) throws InterruptedException { NormalThreadExample example = new NormalThreadExample(); example.haveFun(); } }
//Output : Thread-0 SET 737 Thread-1 SET 404 Thread-1 GET 404 Thread-0 GET 404
public class ThreadLocalExample { public class MyThread implements Runnable { private ThreadLocal<Integer> threadLocalInteger = new ThreadLocal<>(); @Override public void run() { try { Integer randomInt = (int) (Math.random() * 999); System.out.println(Thread.currentThread().getName() + " SET " + randomInt); threadLocalInteger.set(randomInt); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " GET " + threadLocalInteger.get()); } catch (InterruptedException ex) { // SOME HANDLER } } } public void haveFun() throws InterruptedException{ MyThread myThread = new MyThread(); Thread thread1 = new Thread(myThread); Thread thread2 = new Thread(myThread); thread1.start(); thread2.start(); } public static void main(String[] args) throws InterruptedException { ThreadLocalExample example = new ThreadLocalExample(); example.haveFun(); } }
//Output Thread-0 SET 3 Thread-1 SET 860 Thread-1 GET 860 Thread-0 GET 3
Note: Output result may be vary since it’s using random generator.