刚开始学习Java ThreadLocal类型。我可以理解它的典型例子,比如定义一个类,它有一个声明为ThreadLocal的实例字段;然后在创建了这个类的对象之后,我们将这个对象传递给,比如三个独立的线程,它们每个都有自己的这个共享对象的副本。
我的问题在这里可能非常愚蠢,请原谅,为什么我们不创建尽可能多的线程,因此它(可能)会实现相同的结果?
我已经阅读了有关使用ThreadLocal的Hibernate代码:
private static final ThreadLocal threadSession = new ThreadLocal();
public static Session getSession() throws InfrastructureException
{
Session s = (Session) threadSession.get();
try
{
if (s == null) {
s = getSessionFactory().openSession();
threadSession.set(s);
}
}
catch (HibernateException ex)
{
throw new InfrastructureException(ex);
}
return s;
}
我可能的猜测是,首先,我们可能无法预测将会有多少线程;其次,假设将创建许多线程,然后为每个线程创建一个对象是非常昂贵的?
请在这里给我一些指导,专家:)
答案 0 :(得分:2)
为什么我们不创建尽可能多的线程,因此它(可能)会实现相同的结果?
这需要知道有多少线程。更重要的是,它要求我们为对象提供足够的信息以了解它所在的线程,以便它可以检索其线程本地数据,或者我们在更高级别管理线程本地的东西并将其传递给对象。 ThreadLocal
让我们以完全独立的方式实现这一点,并简化了对象接口和线程本地数据的管理。
ThreadLocal
是一个很好的工具,可以为我们处理所有肮脏的工作。