从1.2版开始,JDK中就加入了java.lang.ThreadLocal类。由于在JDK1.4中大幅改进了性能, ThreadLocal成了多线程程序开发人员工具箱中的一件必备工具。
ThreadLocal是简化多线程代码的一个好途径。它使你能够为每个线程保持一个单独的实例,而不必担心线程问题。如果每个Thread一个Connection对象还不够,那么还可以为每个Thread保持一个非线程安全的Connection池。
一个使用ThreadLocal类的最简单的方式是,用你希望共享的值来初始化一个ThreadLocal对象,。ThreadLocal有一个空的构造器和一个set(Object)方法。它所保持的值可以用get(Object)方法获得。
一般来讲很容易扩展ThreadLocal类并用initialValue( )方法来初始化对象。下面是一个使用JDBC Connection的例子:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionLocal extends ThreadLocal {
static private ConnectionLocal instance = new ConnectionLocal();
static public Connection getConnection( ) {
return (Connection)ConnectionLocal.instance.get( );
}
protected Object initialValue( ) {
try {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/todo",
"user", "password");
} catch(SQLException sqle) {
sqle.printStackTrace();
return null;
}
}
}
下面是对静态的getConnection方法的调用:
.. 你的代码 ..
Connection conn = ConnectionLocal.getConnection();
.. 使用连接 ..
只要执行调用的Thread对象——Thread.currentThread( )——是同一个,返回的Connection对象就是相同的。如果不是同一个Thread对象,那么返回的Connection对象也相应地不同。