zoukankan      html  css  js  c++  java
  • 线程ThreadLocal类

    一、什么是ThreadLocal类

      ThreadLocal 在很多地方叫做本地变量,在有些地方叫做线程本地存储。ThreadLocal在每个线程中为每个变量都创建了一个副本,每个线程可以访问自己内部的副本变量,而不会对其它线程的副本变量造成影响。


     二、例子

    public class MyThreadLocal {
    
        //private static  ThreadLocal<Integer> intLocal=new ThreadLocal<Integer>();
        private static ThreadLocal<Long> longLocal = new ThreadLocal<Long>();
        private static ThreadLocal<String> stringLocal = new ThreadLocal<String>();
    
        public void set() {
            //将线程的id设置到ThreadLocal
            longLocal.set(Thread.currentThread().getId());
            //将线程的Name设置到ThreadLocal
            stringLocal.set(Thread.currentThread().getName());
        }
    
        public String getString() {
            //从ThreadLocal中取出线程的变量副本
            return stringLocal.get();
        }
    
        public Long getLong() {
            //从ThreadLocal中取出变量副本
            return longLocal.get();
        }
    
        public static void main(String[] args) {
            MyThreadLocal threadLocal = new MyThreadLocal();
            threadLocal.set();
            String string = threadLocal.getString();
            System.out.println(Thread.currentThread().getName() + ": " + string);
            Long aLong = threadLocal.getLong();
            System.out.println(Thread.currentThread().getId() + ": " + aLong);
    
    
            Thread thread = new Thread() {
                public void run() {
                    threadLocal.set();
                    System.out.println(Thread.currentThread().getName() + ": " + threadLocal.getString());
                    System.out.println(Thread.currentThread().getId() + ": " + threadLocal.getLong());
                }
            };
            thread.start();
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    运行结果:

      如果看不懂没关系,下面会解释各个函数的意思。


    三、ThreadLocal的方法

      

      Public T get(){}

      Public void set(T value){}

      Public void remove(){}

      Public T inittalValue(){}

      

      Get()方法是用来获取ThreadLocal在当前线程中保存的变量副本,set()是用来设置当前线程中变量的副本,remove()是用来移除房钱线程中的变量副本,initialValue()是一个Protected方法,一般是用来在使用时进行重写的。

      首先,在每个线程Thread内部都有一个ThreadLocal.ThreadLcoalMap 类型的成员变量threadLocals,该变量类似一个map,这个map妞儿会死用来存储实际的变量副本的,key存储每个ThreadLocal变量,value用来存储每个ThreadLocal存储的值即变量副本。

      初始时,ThreadLocals为空,当通过ThreadLocal变量调用get()方法或set()方法,就会对Thread类中threadLocals进行初始化,并且以当前的ThreadLocal变量为键值,以ThreadLocal要保存的变量的副本变量为value,存到threadLocals

    总结:

      通过ThreadLocal创建的副本存储在每个线程自己的threadLocals

      threadLocals中用每个ThreadLocal作为key,用每个ThreadLocal要存储的变量副本为value

      在进行get()方法之前,需要先进行set(),否则会报空指针异常。

    ThreadLocal类的使用场景:

    常用来解决数据库连接、Session管理。


    参考资料:

    http://www.cnblogs.com/dolphin0520/

  • 相关阅读:
    JFreeChart生成图片
    itext生成Word
    itext生成PDF
    物理模型name与comment互相转化
    表单序列化为Json(只限input)
    c#多线程同步之EventWaitHandle的应用
    C#多线程之异步编程
    Java环境变量设置
    sharepoint 2013实践
    WPF研究之道——数据驱动UI
  • 原文地址:https://www.cnblogs.com/xuesheng/p/7991594.html
Copyright © 2011-2022 走看看