zoukankan      html  css  js  c++  java
  • java多线程系列17 ThreadLocal

    ThreadLocal 叫做 线程局部变量

    在详细解释之前 先看一段代码

    public class ThreadLocalTest {
    
    	private static ThreadLocal<Integer> intThreadLocal = new ThreadLocal<Integer>();
    
    	public static void main(String[] args) {
    		for (int i = 0; i < 2; i++) {
    			new Thread(new Runnable() {
    				@Override
    				public void run() {
    					int data = new Random().nextInt(10000);
    					System.out.println(Thread.currentThread().getName() + " add data :" + data);
    					intThreadLocal.set(data);
    					System.out.println(Thread.currentThread().getName() + " " + intThreadLocal.get());
    				}
    			}).start();
    		}
    	}
    

      运行结果如下

         

    可以看到每个Thread都是自己设置进去的那个值,相互不影响

     

    ThreadLocal有两个比较重要的方法

    get() set()

    下面我们细看一下 get()

    public T get() {
          //获取当前线程
            Thread t = Thread.currentThread();
          //获取到当前线程的ThreadLocalMap对象,每个线程都有一个
            ThreadLocalMap map = getMap(t);
            if (map != null) {  //不为空 就把ThreadLocal作为key 获取对应的值
                ThreadLocalMap.Entry e = map.getEntry(this);
                if (e != null) {
                    @SuppressWarnings("unchecked")
                    T result = (T)e.value;
                    return result;
                }
            }
            return setInitialValue(); //为空 就初始化
        }
    

      

     下面我们细看一下 set()

      

    //map不为空 将值设置进线程的 ThreadLocal中。为空就new一个
      public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }
    

      

     总结:

    1 ThreadLocal 不是用来解决共享对象的多线程访问问题的,

    一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象(新new出来的对象),其他线程是不需要访问的,也访问不到的。

    倘若都设置的同一个对象 依然会有线程安全问题。

    2  若多个线程之间需要共享资源,以达到线程间的通信时,就使用同步机制;若仅仅需要隔离多线程之间的关系资源,则可以使用ThreadLocal

  • 相关阅读:
    Cookie
    servletContext组件
    Servlet的定义及生命周期
    导引:servlet&Jsp的经典模式
    一个servlet server,由移植自Tomcat的连接器模块和自编写的container模块代码组成
    一个servlet web server,由移植自Tomcat的完整的connector模块和简化的Container(取代servlet处理器)组成
    python初识
    Maekdown光速习得
    实例学习——爬取简书网用户动态
    使用CSDN-markdown编辑器粘贴代码块时崩溃问题解决
  • 原文地址:https://www.cnblogs.com/javabigdata/p/7061069.html
Copyright © 2011-2022 走看看