我在项目中建了这么一个类public class Test {
private static ThreadLocal local = new ThreadLocal(); public static void put(String sp) {
local.set(sp);
} public static String get() {
return (String)local.get();
}
}我在struts的拦截器中取得用户的请求数据,调用Test.set(str),将其中的一数据放入loacl中,然后在dao层的类中用Test.get()取得数据,但是我不理解,当有多个用户请求时,Test.get()就能取得Test.set(str)的str值呢。

解决方案 »

  1.   

    该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 api是的
      

  2.   

    那是不是这么说,调用set方法时,threadloacl会创建一个线程,然后那数据放新建的这个线程中,但是get方法,有多个线程,threadloacl怎么知道要取哪个线程的值啊
      

  3.   

    ThreadLocal使用HashMap, 把每个thread对象作为key来往Map里面存数据
      

  4.   


    ThreadLocal 中没有 HashMap
      

  5.   


    当然知道了,当前线程可以使用 Thread.currentThread() 方法获得。
      

  6.   

    查了一下jdk 说是 Thread.currentThread() 方法 返回对当前正在执行的线程对象的引用。但是当前有多少线程,那是返回哪个当前?
      

  7.   

    线程的运行环境在 JVM 中有一块称为线程栈的地方,线程被封闭在这一块区域内运行,所调用的方法也会从方法区中复制过来供该线程栈中的线程所调用。线程栈中的线程之间是相互隔离互不影响的,因此 Thread.currentThread() 能获得当前线程栈中线程的引用。
      

  8.   

    如果每个线程不是隔离的话,那么不仅在共享变量会存在线程安全问题,就连方法中的局部变量都会存在线程安全问题了。如果不是隔离的话,那么 Java 中的线程、并发操作将会整个崩溃,没办法使用。事实上 Java 中关于线程、并发处理的能力,以及相应的 API,可以称得上在广泛应用的程序设计语言中非常出色的。
      

  9.   

    可以这样理解:
    ThreadLocal可以理解为一个全局的Map对象,
    往里面存东西时,以当前线程的标识为键值。
      

  10.   

    反编辑一下,看看ThreadLocal的源码,其实很简单的。