ThreadLocal类与使用方法介绍
Thread Local类在多线程并行中有较为广泛的应用,可以有效进行线程之间的变量隔离,保障线程的安全性,避免发生内存泄漏。
该类支持泛型,可以保存各种类型对象所产生的线程信息。
ThreadLocal类型常用的三种方法:set(T object),get(),remove()。
set(T Object)方法
该方法是在ThreadLocal对象中加入一个T类型的线程对象,并以Maps的形式保存在ThreadLocal对象中。
get()方法
该方法是获取Thread Local对象中保存的线程副本。并将其赋值给T类型变量。
remove()方法
该方法是销毁在ThreadLocal对象中保存的所有线程。
下面我们以一个常见的数据库链接为例,说明一下他的使用方法。
private static ThreadLocal<Connection> tl=new ThreadLocal();
public static Connection getCon(){
Connection cn=tl.get();
if(cn==null){
try{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection cn=DriverManager(url,user,pwd);
tl.set(cn);
}
catch(Exception e){
}
cn=tl.get();
return cn;
}
}
上述静态方法的作用:从私有ThreadLocal对象中获取一个数据库链接的副本。
使用ThreadLocal获取数据库链接副本的方式进行数据库操作的好处:
1、避免重复new一个数据库链接对象,减少了资源开销。
2、如果使用单一链接进行多个事务的数据库操作,那么很有可能导致事务之间相互等待,以及数据不一致的情况,为每个事务均创建数据库链接副本,在有效利用多线程的同时,也能对多个线程的内容进行封闭,避免了事务对同一数据进行不同操作,导致数据不一致。