04. ThreadLocal的使用及源码解析文章
2022年4月13日
04. ThreadLocal的使用及源码解析文章
线程内部存储数据的工具类。 线程中存储自己的私有数据
ThreadLocal 可以在一个线程中传递同一个对象, 跨方法调用,避免引用传递的麻烦。
线程局部变量
ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段.
fun testThreadLocal() {
val threadLocal = ThreadLocal<String>()
threadLocal.set("主线程")
Thread(Runnable {
threadLocal.set("子线程1")
var i=0;
while (true){
Thread.sleep(1000)
if(threadLocal.get().isNotEmpty()){
println("ThreadLocation子2:"+threadLocal.get().toString())
}else{
println("没有子线程1")
}
Thread.sleep(1000)
threadLocal.set("子线程1"+(i++))
}
}).start()
Thread(Runnable {
threadLocal.set("子线程2")
var i=0;
while (true){
Thread.sleep(1000)
if(threadLocal.get().isNotEmpty()){
println("ThreadLocation子2:"+threadLocal.get().toString())
}else{
println("没有子线程2")
}
Thread.sleep(1000)
threadLocal.set("子线程2"+(i++))
}
}).start()
println("ThreadLocation主:"+threadLocal.get().toString())
}
fun main() {
testThreadLocal()
}
输出
ThreadLocation主:主线程
ThreadLocation子2:子线程2
ThreadLocation子2:子线程1
ThreadLocation子2:子线程10
ThreadLocation子2:子线程20
ThreadLocation子2:子线程21
ThreadLocation子2:子线程11
ThreadLocation子2:子线程12
ThreadLocation子2:子线程22
ThreadLocation子2:子线程13
ThreadLocation子2:子线程23
ThreadLocation子2:子线程24
ThreadLocation子2:子线程14
ThreadLocation子2:子线程25
ThreadLocation子2:子线程15
...
以上我们发现,在不同的线程中ThreadLocal.set并不会改变当前线程的get(),只有所在线程set可以更改。
总结
ThreadLocal将数据绑定在不同的线程中 。适用于不同线程作用域的数据备份。