关于 ThreadLocal 你需要知道的几点
一、ThreadLocal是什么?
-
一个类对象类型,提供属线程本地变量,也就是同一个变量对不同线程保存了不同的值,但是和线程自身定义的自属变量不同。
-
通常以私有静态类型定义,用以保存特定线程特定状态属性。
-
线程存活期间保持对ThreadLocal的弱引用,线程结束后,则变量会被垃圾回收器回收。
二、ThreadLocal使用
//定义一个ThreadLocal变量用以存储不同线程的ID ThreadLocal<Long> localVs = new ThreadLocal<>(); //线程list List<Thread> threads = new ArrayList<>(); //初始化线程 IntStream.range(0, 5).forEach(value -> { Thread tmp = new Thread(() -> { //线程运行时(线程运行期间),将ID放入变量 localVs.set(Thread.currentThread().getId()); //输出当前线程名称,ID System.out.println(Thread.currentThread().getName() + ": " + Thread.currentThread().getId()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //延迟3s,输出当前线程名称,所属ThreadLocal变量 System.out.println(Thread.currentThread().getName() + ": " + localVs.get()); }); threads.add(tmp); }); for (Thread thread : threads) { thread.start(); }
输出:
Thread-0: 12 Thread-2: 14 Thread-1: 13 Thread-4: 16 Thread-3: 15 Disconnected from the target VM, address: '127.0.0.1:59273', transport: 'socket' Thread-1: 13 Thread-0: 12 Thread-2: 14 Thread-4: 16 Thread-3: 15
三、ThreadLocal需要注意的地方
线程中使用ThreadLocal类型变量,在线程声明周期结束前调用ThreadLocal::remove()方法,清除对应本线程的变量内存占用,避免内存泄漏。
五、附加订阅