ThreadLocal类的使用

ThreadLocal类:这个类提供线程局部变量。这些变量与其对应方式不同,因为访问每个线程都有自己独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段。

 

ThreadLocal里边有两个方法get()和set()方法用于向当前线程中添加一个map集合key为当前的ThreadLocal对象,value为添加到ThreadLocal的对象。get的时候获取的是当前ThreadLocal对应的value值,即存放进的对象。

源码

 public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 

每次存入数据时,先得到当前线程,然后得到当前线程的一个map集合,判断map集合是否为空,为空则添加键值对,不为空,则不添加键值对。键:当前ThreadLocal值:存入的对象,放入的是当前线程的一个空间,数据线程不属于ThreadLocal.

public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

  

事务的一致性可以通过ThreadLocal来实现,定义工具类时,通过定义一个静态的ThreadLocal变量来存储Conllection对象,保证service层和dao层获得的数据库连接属于同一个连接,然后通过这同一个连接对数据库进行一些列操作,以及事务的回滚等等,从而保证事务的执行。

例子:

public class DBUtils {
	private static ComboPooledDataSource cs=new ComboPooledDataSource();
	public static ThreadLocal<Connection> th=new ThreadLocal<Connection>();
	
	public static DataSource getDataSource(){
		return cs;
	}
	
	public static Connection getConnection() throws SQLException{
		Connection conn = th.get();
		if(conn==null){
			conn=cs.getConnection();
			th.set(conn);
		}
		return conn;
	}
}

 Java事务的提交通过Connection进行提交,设置当前事务手动提交conn.setAutoCommit(false)设置事务回滚conn.rollback()设置事务提交conn.commit()所以如果dao层和service层获得的connection不是同一个,便不能保证事务的正确提交。

 

 

ThreadLocal 类:这个类提供线程局部变量。这些变量与其对应方式不同,因为访问每个线程都有自己独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段。   ThreadLocal里边有两个方法get()和set()方法用于向当前线程中添加一个map集合key为当前的ThreadLocal对象,value为添加到ThreadLocal的对象。get的时候获取的是当前ThreadLocal对应的value值,即存放进的对象。 源码   每次存入数据时,先得到当前线程,然后得到当前线程的一个map集合,判断map集合是否为空,为空则添加键值对,不为空,则不添加键值对。键:当前ThreadLocal值:存入的对象,放入的是当前线程的一个空间,数据线程不属于ThreadLocal. 事务的一致性可以通过ThreadLocal来实现,定义工具类时,通过定义一个静态的ThreadLocal变量来存储Conllection对象,保证service层和dao层获得的数据库连接属于同一个连接,然后通过这同一个连接对数据库进行一些列操作,以及事务的回滚等等,从而保证事务的执行。 例子:
public class DBUtils {
	private static ComboPooledDataSource cs=new ComboPooledDataSource();
	public static ThreadLocal<Connection> th=new ThreadLocal<Connection>();
	
	public static DataSource getDataSource(){
		return cs;
	}
	
	public static Connection getConnection() throws SQLException{
		Connection conn = th.get();
		if(conn==null){
			conn=cs.getConnection();
			th.set(conn);
		}
		return conn;
	}
}
 Java事务的提交通过Connection进行提交,设置当前事务手动提交conn.setAutoCommit(false)设置事务回滚conn.rollback()设置事务提交conn.commit()所以如果dao层和service层获得的connection不是同一个,便不能保证事务的正确提交。    

猜你喜欢

转载自754054144.iteye.com/blog/2399228