线程基础知识
2022-06-20 10:08:13 13 举报
Java多线程相关基础知识,包括ThreadLocal类的详解
作者其他创作
大纲/内容
线程创建的三种方式
继承Thread类
实现Runnable接口
使用Callable和FutureTask创建线程
Runnable异步任务的问题:1.无法获取异步任务的结果2.无法取消异步任务的执行
使用静态工厂Executors线程池创建线程
线程的调度模型
分时调度模型
抢占式调度
线程的基本状态
start方法和run方法的区别
ThreadLocal的原理
jdk1.7中,ThreadLocalMap的拥有者是ThreadLocal,一个ThreadLocal实例对应一个ThreadLocalMap,其中的Key是Thread,Value是local value
存在的弊端:
浪费空间:如果线程数量多,那么一个ThreadLocalMap存储“key-value”的entry的数量也多,程序的ThreadLocal实例较少,而线程数较多,所以,这种设计方案,比较浪费空间。
存货周期太长:在Thread销毁后,ThreadLocal实例内部的ThreadLocalMap还是存在的。ThreadLocal本来是给Thread做隔离的,现在Thread销毁了,但是ThreadLocal还在。
jdk1.8中,ThreadLocalMap的定义还是在ThreadLocal中,但是其拥有者变成了Thread,其Map的结构也发生了改变,Key为一个ThreadLocal实例,Value是local value。
ThreadLocal中的entry的key为什么设计为弱引用?
entry需要使用弱引用来对key进行包装,当key没有强引用指向的时候,key可以被回收,从而entry中的value也能被回收。
为什么用private static final来修饰ThreadLocal
1.使用static的作用:一个线程一个Map,静态的ThreadLocal可以被共享,节省空间。由于静态变量只会在类第一次被使用时加载,只会分配一次内存空间,此类的所有实例都会共享这个。
2.使用final关键字:
好处:以防止其在使用过程中发生动态变更,比如在函数传递中ThreadLocal发生改变会造成原先ThreadLocal的值发生改变
坏处:使用static final修饰ThreadLocal,破坏了原有的ThreadLocalMap的内存泄露机制。
解决方案:手动remove。
收藏
收藏
0 条评论
下一页