线程概念信息

ThreadLocal在使用后remove,对于web请求,可以定义一个拦截器,在前置通知中加入用户信息,在后置方法中移除ThreadLocal
1、ThreadLocal内存泄漏的问题,ThreadLocal一定内存泄漏吗?
原理:ThreadLocal的key为弱引用,所以gc的时候一定会gc回收,而value为强引用,所以gc的时候回收不了。所以造成value一直存在(且该线程必须运行,且不再被调用)
1.1、比如gc了之后用户访问导致该线程又被使用,最终使用了ThreadLocal的set方法,set方法会清理key为null(gc回收导致key为null)的value。
1.2、如1.1所述,如果ThreadLocal只是存储很小的用户信息这种变量,会导致内存一直会持有上一个用户的信息,但是由于占用很小,即使不回收也不存在内存泄漏的问题。
1.3、只有满足线程不会被调用,且value对象的数据量足够大才会触发gc,比如8个线程的线程池,jvm内存为8m(不考虑其他类等的占用),当一个线程的value超过1m的时候,持续去访问系统,就会造成其他线程的value无法回收,最终系统内存不够,触发gc,gc回收的内存也不足,最终oom。

1.4、java中当最后一个非后台线程停止的时候jvm会关闭所有的后台进程,此时后台进程的finally语句将不会执行。

1.5、yield():我已经执行完生命中的重要方法可以将cpu转移给其他线程(是建议,而不是保证,同时不会释放锁)

1.6、join(): 在线程b中调用a的join()方法,代表b被挂起直到a执行完毕(如果有超时参数就是超时参数)。

1.7、ThreadFactory:线程创建工厂,通过对该接口的实现决定我们的线程是怎么样new的,最简单的直接new。

1.8、在主线程中无法获取主线程创建(或者使用线程池)的线程抛出的异常。但是可以通过设置线程的Thread.UncaughtExceptionHandler处理器来处理子线程抛出的异常。

1.9、java中即使是单一的递增也是不安全的,因为递增底层有好几条指令。

1.11、 synchronized普通方法会锁"对象",其他的synchronized方法必须等到前一个synchronized方法执行完成;静态方法,锁的是当前Class对象;块,锁的是()中的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值