前几天使用SimpleDateFormat类因为线程不安全导致程序不稳定,解决问题后,顺带复习了下JAVA线程安全方面的知识,这里主要还是介绍下ThreadLocal这个类。
ThreadLocal类可以用来存储线程私有的成员变量,其原理是创建了一个用线程ID作为key,要保证线程安全的变量副本作为value的HashMap,其使用方法很简单,一般是建立一个匿名的内部类,然后重写一些方法,下面是一段获取线程安全的从连接池获取数据库连接的代码例子:
public class DBPool{
private ThreadLocal connectionHolder = new ThreadLocal();
public static Connection getConnection(){
Connection conn = connectionHolder .get();
if(conn==null){
conn = dataSource.getConnection();
connectionHolder.set(conn);
}
return connectionHolder.get();
}
......
}
然后在我们后续需要获取连接的地方只需要调用DBPool.getConnection()就可以获得线程安全的数据库连接。
ThreadLocal为调用者提供了变量的副本。用这个方法,也可以解决前面的SimpleDateFormat线程安全问题。