线程封闭:线程封闭的对象只能由一个线程拥有。对象被封闭在该线程中,。只能由这个线程修改或访问,其他线程不能修改或访问。
在java线程中使用TheadLocal维持线程封闭。
TheadLocal对象可以防止对可变对象的单变量实例或者全局变量进行共享。
TheadLocal提供get和set方法为变量在每个线程中存有一份副本。
当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候最适合使用ThreadLocal。
示例代码,使用ThreadLocal维护Connection副本。
public final class ConnectionUtil {
private ConnectionUtil() {}
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<>();
public static Connection getConn() {
Connection conn = connectionHolder.get();
if (con == null) {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("url", "userName", "password");
connectionHolder.set(con);
} catch (ClassNotFoundException | SQLException e) {
// ...
}
}
return conn;
}
}
TheadLocal使用场景
随机数
线程安全的时间函数
保存上下文信息
1、每个Thread对象内部都维护了一个ThreadLocalMap这样一个ThreadLocal的Map,可以存放若干个ThreadLocal。
/* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class.
*/
ThreadLocal.ThreadLocalMap threadLocals = null;
2、当我们在调用get()方法的时候,先获取当前线程,然后获取到当前线程的ThreadLocalMap对象,如果非空,那么取出ThreadLocal的value,否则进行初始化,初始化就是将initialValue的值set到ThreadLocal中。
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
3、当我们调用set()方法的时候,就是将值设置进ThreadLocal中。
原文:https://www.cnblogs.com/mlzrq/p/10450713.html