【概述】
线程局部变量,是一种多线程间并发访问变量的解决方案。与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。
从性能上讲,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在并发量很高或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争。
【实例】
public class Test{ public static void main(String[] args) throws Exception{ ThreadLocalDemo.setLong(666L); ThreadLocalDemo.setString("666sss"); ThreadLocalDemo.getAll(); //新线程t1 Thread t1 = new Thread(new Runnable() { @Override public void run() { ThreadLocalDemo.setLong(100L); ThreadLocalDemo.setString("100sss"); ThreadLocalDemo.getAll(); } }); //启动新线程t1 t1.start(); Thread.sleep(1000); ThreadLocalDemo.getAll(); } } class ThreadLocalDemo{ public static ThreadLocal<String> localString = new ThreadLocal<>(); public static ThreadLocal<Long> localLong = new ThreadLocal<>(); public static void setLong(Long l){ localLong.set(l); } public static void setString(String s){ localString.set(s); } public static void getAll(){ System.out.println("localString.get()=" + localString.get() + ",localLong.get()=" + localLong.get()); } }
【运行结果】