ThreadLocal是什么?
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。
对比Synchronized,我们就能更好的理解——Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离
ThreadLocal的用法(存在意义)
一、同一线程内共享数据
一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程,如图所示:
同一线程贯通三层这样你就可以根据需要,将一些非线程安全的变量以ThreadLocal存放,在同一次请求响应的调用线程中,所有关联的对象引用到的都是同一个变量。
例如下面这个例子:
我需要在执行完毕的时候对事物提交,发生异常的时候对事务进行回滚,那么就要求我们进行提交/回滚的Connection连接和执行增删查改的连接是同一个——即一个事务一个连接,问题在于,我们获取连接的方式如果是通过连接池(DataSource)来完成,那么每次获取的连接都不一定是相同的!
@Before
public void before(){
ad = new AccountDaoImp();
}
@Test
public void transfer(){
Connection conn = DataSourceUtils.getConnection();
try {
conn.setAutoCommit(false);
ad.decreaMoney(2, 2000);
int a = 1/0;
ad.increaMoney(1,2000);
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace