1、ThreadLocal跟共享有什么关系吗?2、在Java Concurrency In Practice上看到一个例子: private static ThreadLocal<Connection> connectionHolder
= new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};

public static Connection getConnection() {
return connectionHolder.get();
}这个就是为每个线程都会开一个连接,而感觉如下也是一个线程开一个连接: public static Connection getConnection() {
return DriverManager.getConnection(DB_URL);
}是不是在有线程池的情况下以上两种方式才有区别?3、除了上面上的Connection例子,还有在什么情况下会考虑用ThreadLocal?谢谢

解决方案 »

  1.   

    线程不安全的类在多线程中使用,如 SimpleDateFormat;在一个线程中修改不影响其他线程的使用。
      

  2.   

    今天老师说了这个。。可以在同一个线程之中传递数据。要是你不用框架做javaee,你可能需要写处理事务的sql语句,你可以选择把一个Connection放在localthread里面,在service层取出来使用。
      

  3.   

    所谓ThreadLocal,简单一点想,就是一个全局的Map,Map的key是线程对象,value是你要保存的对象进入某个线程后,就可以从map中取得之前存储的相应线程关联的对象当然,ThreadLocal并不是一个Map,但用Map来理解是没有问题的
      

  4.   

    1.ThreadLocal是线程局部 (thread-local) 变量,线程共享,我们写的程序一般是面像对象的,不是面向线程的,一个线程可能有N个对象,但他们工作时可能只需要共享一个资源,这个资源可以放在ThreadLocal里,当然,你愿意你以可以以参数形式在这个线上的每个对象之间传递( 这个相当麻烦)。
    2.与有没有线程池无关。
    3.有很多地方,比如在Hibernate中的Session(不是HTTP Session)
      

  5.   

    ThreadLocal是什么玩意可以多看一些开源的框架的源代码,里面大量使用了ThreadLocal。
      

  6.   

    ThreadLocal不是map没错,但是其实他里面有通过ThreadLocalMap来管理实现,ThreadLocalMap就是一张自定义的只为维护thread local values 的Hash Map, 这张map的key就是Thread.currentThread().
      

  7.   

    注意,ThreadLocal在那个线程里面put的值,那么一定要在同一个线程里面get,不然会获取出错的~~~
    比如我们的web项目,用ThreadLocal保存session的值,结果异步任务无法从ThreadLocal里面获取正确的session。
      

  8.   

    之前大概看了下,其实它里面就是一个ThreadLocalMap,在get的时候先取到currentThread,看看map中有没有。
    但是各位好像都没回答我的几个问题。
      

  9.   

    java里面的变量的作用范围,有的是局部变量,有的是成员变量。局部变量永远不存在线程安全问题,成员变量是所有的线程所共享的,ThreadLocal的出现就弥补了这两种范围的一个不足,它比局部变量的范围要大,不仅仅是局限于一个方法块,但是又比成员变量的范围要小,因为它不会被多个线程共享,是线程独占的。1、ThreadLocal跟共享有什么关系吗?ThreadLocal是线程独占的。2.
    public static Connection getConnection() {
            return DriverManager.getConnection(DB_URL);
        }这种方式多线程访问会有线程安全问题,ThreadLocal就不会。3、除了上面上的Connection例子,还有在什么情况下会考虑用ThreadLocal?

      

  10.   

    1、如何线程独占了?connectionHolder不是成员变量吗?
    2、不是线程安全因为DriverManager.getConnection(DB_URL)不是线程安全的?望大神说仔细些,确实没用过ThreadLocal,无法领会。
      

  11.   

    看到一篇博客说过,还模拟实现了ThreadLocal,貌似不是我想要的,需要知道一种场景,没有ThreadLocal就不行~~~
      

  12.   


    与共享木有关系  ThreadLocal 是多线程中的免锁解决方案之一。 就是每个线程对于ThreadLocal 都有一个备份  ,这篇内存分配在堆上。
    第二点  在两个线程同时执行getConnection()  的时候  会生成两个链接哦。第三点 ThreadLocal  是多线程下的无锁定解决方案   主要用于保存 线程 的特征,比如你给线程重命名啦之类的 。  
    核心是 每个线程中都有一个 ThreadLocal 的 副本  而 普通的则是共享的
      

  13.   

    ThreadLocal 主要还是在线程内部共享数据,很方便,让线程知道什么是自己的数据。