请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于使用TreadLocal解决线上问题的疑问?

有个疑问,为什么要用线程本地变量,直接方法调用的末尾清除缓存不就行了吗?
首先本地缓存设置过期时间,其次在方法的结尾手动清除本地缓存,是否也可以避免Full GC?

正在回答 回答被采纳积分+3

1回答

甲蛙 2024-09-06 20:47:51

你说的在方法的结尾清除,其实这个就是线程本地变量的功能,在线程结束后,线程本地变量也释放了。你这个方法会有问题,缓存本质上是多线程共享,才有缓存的意义,所以在结尾清除本地缓存,就可能影响其它线程的读取。如果你做成每个线程各自存取缓存,那这个就是线程本地变量的功能了。

0 回复 有任何疑惑可以回复我~
  • 提问者 HenceForward #1
    谢谢老师,我理解您的意思了!这里我还有一个疑问,针对您这个场景,threadLocal的数据是否也需要在finally里面给remove掉,因为threadlocal会有内存泄露的隐患,spring再执行操作的时候是服用线程池的,线程执行完可能不会释放,这样会不会导致threadLocal里面的数据越来越大,最终造成OOM呢?
    回复 有任何疑惑可以回复我~ 2024-09-06 21:12:03
  • 甲蛙 回复 提问者 HenceForward #2
    一般不会OOM,但确实会占用内存,线程池复用时,threadlocal变量会覆盖。不remove,也就占用着线程池数量相等的内存变量,线程数一般不会高到导致内存溢出。但还是推荐remove,可以在AOP类的环绕通知里加个remove
    回复 有任何疑惑可以回复我~ 2024-09-23 13:29:14
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信