ThreadLocal作为一个可以将数据进行线程隔离的解决方法,其本质还是将数据存放在各个线程对象中(数据存放在Thread的ThreadLocalMap threadLocals中);
那么为什么JDK不在设计的时候就使Thread对象具有保存线程上下文的能力呢?
比如可以这样:
[code="java"]public class Thread
{
...
private Map contexts = new WeakHashMap();
public void setContext(Object key, Object value)
{
contexts.put(key, value);
}
public void getContext(Object key)
{
contexts.get(key);
}
}[/code]
使用的时候Thread.getCurrentThread.getContext(key);简单方便
JDK实现者是出于什么考虑才这样设计的?
楼主你真的很搞笑,你这样就违背了数据的封装原则。Thread作为类,为什么要提别人保存属性啊 就好比一个people类,存放很多别人的名字一样 。首先threadlocal是一个类,但是他的使用原则,是有多个线程共同工作在一个环境下,如果乜有threadlocal类,那么在实际的编码中,我们很喜欢调用一个帮助类,来辅助解决这个问题的。如ThreadHelper之类的。
这个没有必要在jdk里面加,使用了线程不一定就得使用一个上下文变量,不用的时候就多余了,所以还是开发人员自己定义。
[code="java"]、
package threadLoacl;
import java.sql.Connection;
import java.sql.SQLException;
/**
@author 爽
*
*/
public class ConnectionManager {
/** 线程内共享Connection,ThreadLocal通常是全局的,支持泛型 */
private static ThreadLocal threadLocal = new ThreadLocal();
// private static ThreadLocal threadLocal1 = new ThreadLocal();
public static Connection getCurrConnection() {
// 获取当前线程内共享的Connection
Connection conn = threadLocal.get();
try {
// 判断连接是否可用
if(conn == null || conn.isClosed()) {
// 创建新的Connection赋值给conn(略)
// conn =new Connection();
// 保存Connection
threadLocal.set(conn);
}
} catch (SQLException e) {
// 异常处理
}
return conn;
}
/**
1、ThreadLocal的实现对其他线程是不可见的,你的实现方法对其他线程可见,没有很好的隔离。
2、ThreadLocal相对HashMap还做了一些性能优化。在Java系统里ThreadLocal使用非常普遍,最常用的String类的编解码都要使用它。性能是很重要的。