每日一技 之Java Thread Local

386 阅读1分钟

今天学习到一个新的技能点, ThreadLocal. 用于Java中的线程数据隔离

Demo如下:

public class Manager {
    ThreadLocal<Object> object = new ThreadLocal<>();

    public void conn() {
        object.set(new Object());
        System.out.println("conn:" + object.get());
    }

    public void close() {
        System.out.println("close" + object.get());
    }
}

我们的Main类如下:

fun main() {
    val manager = Manager()
    val thread1 = Thread() {
        manager.conn()
        manager.close()
    }
    val thread2 = Thread {
        manager.conn()
        manager.close()
    }

    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
}

打印如下:

conn:java.lang.Object@1844c4ab
closejava.lang.Object@1844c4ab
conn:java.lang.Object@461d64a5
closejava.lang.Object@461d64a5

Process finished with exit code 0

可以看到ThreadLocal可以做到线程间数据隔离的效果. 这里有几个需要注意点

  1. 显而易见, ThreadLocal中的变量生命周期是整个Thread的生命周期, 所以要注意OOM风险
  2. 在有线程池的场景下, 线程会"重用", 所以当使用完之后, 最好能对ThreadLocal中的数据做清空处理

其他没有什么. 里面就一个Map在管理所有的变量. 很简单