今天学习到一个新的技能点, 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可以做到线程间数据隔离的效果. 这里有几个需要注意点
- 显而易见, ThreadLocal中的变量生命周期是整个Thread的生命周期, 所以要注意OOM风险
- 在有线程池的场景下, 线程会"重用", 所以当使用完之后, 最好能对ThreadLocal中的数据做清空处理
其他没有什么. 里面就一个Map在管理所有的变量. 很简单