threadlocal存在内存泄露问题。编程时要小心。 jdk给予的优化是,内部的entry extends WeekRefrence<ThreadLocal>,这样每一次gc的时候,都会回收entry中的key引用的threadlocal对象,还有get和set操作的内部,会清理key为null的entry,这样使entry value引用的对象,脱离引用链,具备了被回收的资格。
为什么是主线程调用的
晚上梳理该Demo
意思是线程在阻塞状态下被interrupt,该线程的interrupted就会是false,因为阻塞方法都是可中断方法,会捕获到interrupt信号,导致interrupt flag被擦除(复位)
注释①是调用的interrupted方法,会导致线程的interrupted flag被擦除(复位),而isinterrupted不会擦除该标识,所以sleep可中断方法会捕获到中断信号。
验证该Demo
实验一下jvm退出后,非守护线程是否还在执行
代码研究
堆栈内存对线程数量的影响
线程数量计算方式
threadlocal存在内存泄露问题。编程时要小心。 jdk给予的优化是,内部的entry extends WeekRefrence<ThreadLocal>,这样每一次gc的时候,都会回收entry中的key引用的threadlocal对象,还有get和set操作的内部,会清理key为null的entry,这样使entry value引用的对象,脱离引用链,具备了被回收的资格。
为什么是主线程调用的
晚上梳理该Demo
意思是线程在阻塞状态下被interrupt,该线程的interrupted就会是false,因为阻塞方法都是可中断方法,会捕获到interrupt信号,导致interrupt flag被擦除(复位)
注释①是调用的interrupted方法,会导致线程的interrupted flag被擦除(复位),而isinterrupted不会擦除该标识,所以sleep可中断方法会捕获到中断信号。
验证该Demo
实验一下jvm退出后,非守护线程是否还在执行
代码研究
堆栈内存对线程数量的影响
线程数量计算方式