ThreadLocal提供了线程局部变量,可以视为内部通过一个Map(实际是内部类ThreadLocalMap)存取数据,存取数据只在同一线程有效。
下面是该类的简单模拟,实际比这复杂:
public class ThreadLocal<T>{
private Map<Runnable,T> map = new HashMap<Runnable,T>();
//把传入的参数绑定到当前线程上
public void set(T t){
map.put(Thread.currentThread(),t);
}
//从当前线程上删除对象
public void remove(){
map.remove(Thread.currentThread());
}
//获取当前线程上绑定的对象
public T get(){
return map.get(Thread.currentThread());
}
}
应用:
1、管理Connection,控制事物开启关闭
import java.sql.Connection;
import java.sql.SQLException;
/**
* 封装事物相关方法,确保dao层中使用的Connection相同
*/
public class TransactionManager {
//
private static ThreadLocal<Connection> tLocal=new ThreadLocal<>();
/**
* 从线程中获取连接
* @return
*/
public static Connection getConnection(){
Connection conn = tLocal.get();
if(conn==null){
conn=DBCPUtil.getConnection();
tLocal.set(conn);
}
return conn;
}
/**
* 开启事物
*/
public static void startTransaction(){
try {
Connection conn = getConnection();
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 回退
*/
public static void rollback(){
try {
Connection conn = getConnection();
conn.rollback();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 提交
*/
public static void commit(){
try {
Connection conn = getConnection();
conn.commit();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 连接回到连接池,线程局部变量清空
*/
public static void release(){
try {
Connection conn = getConnection();
conn.close();
tLocal.remove();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
2、在struts2框架中,ActionContext就是通过此类控制的
static ThreadLocal<ActionContext> actionContext = new ThreadLocal<ActionContext>();