没用的代码就不罗嗦了...
主要的如下 :....
private static final ThreadLocal<T> local=new ThreadLocal<T>();为啥这个 local 要定义为final类型的,难道用 private static  不行吗
我做测试的时候,  用private static 和用 private static final  结果是一样的
那们朋友帮忙看下
最好能给个 private static 和 private static final 区别的例子,先谢了...  

解决方案 »

  1.   

    final是不能够再赋值的啊。所以,如果声明:
    private static ThreadLocal <T> local=new ThreadLocal <T>(); 则如果后面再有人调用local=new ThreadLocal<T>();
    也是合法的,这样可能会破坏ThreadLocal的意义。而如果加上Final,则一旦初始化,就不可能有人再改变local的指向。
      

  2.   

    final定义的是常量,ThreadLocal内部是一个map实现的,因为有些资源的获得是比较消耗时间或消耗机器资源的,所以要借助这个类来实现,保存在低层的map中,保证每次用到的同一个资源是上次的那个原来的,不需要重新获得,例如:hibernate中的session就是通过这种方式来管理的,整个系统中只需要一份,而且获得session也得付出代价,所以就定义成静太常量.
      

  3.   

    你自己测试吧 ,如果我哪里说的不对你可以告诉我,相互交流么。
    package test;//private static 和 private static final 调用的例子
    class Test {//extends String 这里 你要继承String 会报错 因为String 类是final  终极(final)类不能被继承 public static void main(String[] args) {

    final String strFin = "String_1";
    String strFin1="String_1";
    System.out.println(new Test().sta());
    System.out.println(sta());// 与上面的等价
    strFin1= fin();//  把final修饰的静态方法 赋值给了String类型的没有问题
    //strFin=fin();// 我把这行代码注释掉了 因为这行语句处错误了  对于final修饰的成员变量 你在想给他赋值 会报错 这里体现了final 是终极变量,不可以改变
    System.out.println(strFin1);
       //System.out.println(fin1(strFin1));//但是这里没有体现出final的作用  我个人和实践得到的结论是 final修饰的方法没有和别的不同


    } private static String sta() {
    String str = "static修饰的方法测试";
    return str;
    } private static final String fin() {
    String str = "static修饰的final_1方法";
    return str; }
    private static final String fin1(String str1 ) {
    String str = str1;
    return str; }
    }
      

  4.   

    1楼正解你的东东放在一个map中,threadlocal实际上作为这个map中的键值,这个map实例实际上在current thread中,但是这个map类结构却在threadlocal中描述...没糊涂吧?
    threadlocal作为键值当然不能更改,改了你就再也找不回你放到map中的东东了。
    不信你可以试试:
    声明一个非final的threadlocal、放进东西去、重新创建这个threadlocal、再从中取,返回null...
      

  5.   


    其实也并不是说 final更快点,只是不希望值更改
      

  6.   

    定义成 final 就是为了不能改变。ThreadLocal 就像是一个盒子,大家都可以放取东西。但盒子不能换掉,不然放进去的东西一下子就没了