1、ThreadLocal跟共享有什么关系吗?2、在Java Concurrency In Practice上看到一个例子: private static ThreadLocal<Connection> connectionHolder
= new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
public static Connection getConnection() {
return connectionHolder.get();
}这个就是为每个线程都会开一个连接,而感觉如下也是一个线程开一个连接: public static Connection getConnection() {
return DriverManager.getConnection(DB_URL);
}是不是在有线程池的情况下以上两种方式才有区别?3、除了上面上的Connection例子,还有在什么情况下会考虑用ThreadLocal?谢谢
= new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
public static Connection getConnection() {
return connectionHolder.get();
}这个就是为每个线程都会开一个连接,而感觉如下也是一个线程开一个连接: public static Connection getConnection() {
return DriverManager.getConnection(DB_URL);
}是不是在有线程池的情况下以上两种方式才有区别?3、除了上面上的Connection例子,还有在什么情况下会考虑用ThreadLocal?谢谢
2.与有没有线程池无关。
3.有很多地方,比如在Hibernate中的Session(不是HTTP Session)
比如我们的web项目,用ThreadLocal保存session的值,结果异步任务无法从ThreadLocal里面获取正确的session。
但是各位好像都没回答我的几个问题。
public static Connection getConnection() {
return DriverManager.getConnection(DB_URL);
}这种方式多线程访问会有线程安全问题,ThreadLocal就不会。3、除了上面上的Connection例子,还有在什么情况下会考虑用ThreadLocal?
。
2、不是线程安全因为DriverManager.getConnection(DB_URL)不是线程安全的?望大神说仔细些,确实没用过ThreadLocal,无法领会。
与共享木有关系 ThreadLocal 是多线程中的免锁解决方案之一。 就是每个线程对于ThreadLocal 都有一个备份 ,这篇内存分配在堆上。
第二点 在两个线程同时执行getConnection() 的时候 会生成两个链接哦。第三点 ThreadLocal 是多线程下的无锁定解决方案 主要用于保存 线程 的特征,比如你给线程重命名啦之类的 。
核心是 每个线程中都有一个 ThreadLocal 的 副本 而 普通的则是共享的