ThreadLocal<T>

简介

  ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。这就好比在web工程中一个用户在查询数据时,传入的查询条件被其他用户的查询条件覆盖,以至于查询的结果非自己的结果。

原理

  在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。每个线程就可以对自己创建的副本变量进行操作,副本变量是一个只对本线程可见的局部变量。每次可以通过get()函数来获取线程中的局部变量,用set()函数设置线程中的局部变量。

连接数据库中的介绍

  因为当一个业务逻辑要对多个DAO进行处理的时候,此操作属于同一个线程内。所以,我们希望能把此Connection放在线程内,或者和线程有关联。在任何一个线程内都可以用ThreadLocal来保存一个变量的copy,这样,如果此对象存在,就可以直接取用。如果ThreadLocal中放置connection, 保证事务中的DAO类获取的都是同一个connection,这样才保证事务。所以,在同一个线程内,不同的DAO就可以保证取得到的是同一个Connection。