2 chuliuxiang531 chuliuxiang531 于 2017.08.28 12:24 提问

JAVA使用threadlocal如何进行资源释放

使用threadlocal,线程结束前如何能够将threadlocal中的数据库资源释放?我知道线程结束后,threadlocal中实例能gc,但是想在销毁前释放资源,求大神指一条路,万分感谢

PS:使用mybatis从服务器数据源获取的连接

5个回答

qq_34658785
qq_34658785   2017.08.28 13:32

没使用过threadlocal,但是既然是java中的,它应该是一个对象,你可以通过重写finalize这个方法,这个方法继承自object,gc回收对象之前,会调用这个方法,这个方法一般用于资源的释放,应该能解决你的问题

vane11
vane11   2017.08.28 13:47

这个有点不好说清,先说一点嘛,JVM的GC,并不是人为控制的(不讨论主动触发的情况),一般的释放操作也只是让当前对象变得游离,使其下次被GC,并不是直接让对象真的释放
然后,如果当前资源是mybatis的数据库连接,针对连接可以close,但当前类还是存在的,这类资源都会在gc是处理掉

danee1
danee1   2017.08.28 14:01

使用的threadloca 的生命周期是跟随当前线程的,如果你说想在当前线程结束前销毁链接资源,那你把对链接资源的引用设置成null即可。
1.首先 gc是不会由你手动控制的,所谓的finalize 方法 是 gc前会调用类的 finalize方法,也就是说 当gc时,会先执行一下finalize方法而已,不是手动执行gc。
2.其次 真正当你的内存吃紧,不够的时候 触发gc,gc查看,你的threadlocal 正在被使用 不会回收,但是 那个链接资源 可没人引用它了,(因为你设成null了),
那就直接回收了链接资源。 这样就是你说的 线程结束前,回收资源了。

liugstick
liugstick   2017.08.28 14:33

GC是系统一套算法,销毁的效率相对很低的(除非内存紧缺),自己完全可以在线程执行完毕前释放一些资源

li_ling_ren
li_ling_ren   2017.08.28 17:48

直接set(null)方法就可以了

Csdn user default icon
上传中...
上传图片
插入图片