zoukankan      html  css  js  c++  java
  • 理解ThreadLocal

    ThreadLocal:线程本地存储,为每个线程都创建了变量的副本,线程在访问变量时,可以直接访问自己内部的副本变量。
    理解几个概念:
    在java中ThreadLocal是一个类。
    ThreadMap是一个类,
    Thread类是线程类。

    ThreadLocal类中有一个ThreadMap的内部类。
    Thread类中有一个成员变量是threadLocals
    其类型为:ThreadLocalMap
    ThreadLocal.ThreadLocalMap threadLocals = null;
    ThreadLocalMap的key值为ThreadLocal类型。

    通过ThreadLocal为threadLocals添加值:

    package processthread; 
    
    
    /** 
     * @author wangpei 
     * @version 
     *创建时间:2017年3月11日 下午2:16:48 
     * 类说明 
     */
    public class ThreadLocalTest {
        public static ThreadLocal<Integer> longLocal=new ThreadLocal<Integer>();
        public static void main(String[] args) {
            ThreadLocalTest th=new ThreadLocalTest();
            ThreadLocalTest.ThreadTest thread=th.new ThreadTest ();
            thread.start();
            ThreadLocalTest.ThreadTest2 thread2=th.new ThreadTest2 ();
            thread2.start();
        }
    
    
    
     class ThreadTest extends Thread{
    
         public void run(){
             System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
             ThreadLocalTest v=new ThreadLocalTest();
             v.longLocal.set(2);
             System.out.println(v.longLocal.get());
    
    
    
         }   
         }
    
         class ThreadTest2 extends Thread{
    
             public void run(){
                 System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
                 ThreadLocalTest v=new ThreadLocalTest();
                 v.longLocal.set(3);
                 System.out.println(v.longLocal.get());
    
                 }
         }
     }

    结果:
    线程Thread-0正在执行
    2
    线程Thread-1正在执行
    3

    执行上面的结果可以看出,thread-0通过ThreadLocal写入自己的副本变量2,thread-1通过ThreadLocal写入自己的副本变量3
    这两个副本变量是线程中私有的空间。
    源码分析:
    ThreadLocal的set方法:

     public void set(T value) {
            Thread t = Thread.currentThread();
            ThreadLocalMap map = getMap(t);
            if (map != null)
                map.set(this, value);
            else
                createMap(t, value);
        }

    解释:map中存放当前线程的threadLocals的值,如果map不为空,则
    为map存放一个key值为当前ThreadLocal的Entry

      ThreadLocalMap getMap(Thread t) {
            return t.threadLocals;
        }

    ThreadLocal 的get方法:

    ThreadLocalMap getMap(Thread t) {
            return t.threadLocals;
        }

    返回线程t的threafLocals值。

    ThreadLocal的应用:jdbc操作数据库时,建立连接,如果在多线程情况下,必须加锁实现同步,而此时,效率会大大降低。
    可以为将connection写进每个线程的threadLocals中,实现同步。这样每个线程都有自己的connection副本,每个线程间互不影响。

  • 相关阅读:
    你可能不知道的 Laravel Eloquent 小技巧
    Intervention/image 对 Laravel 项目中的图片进行处理
    phpspider简单快速上手的php爬虫框架
    laravel job 与 event 的区别
    laravel 存储配置 Redis 多个库选择
    【XSS技巧拓展】————28、The Shortest Reflected XSS Attack Possible
    【XSS技巧拓展】————27、Avoiding XSS Detection
    【XSS技巧拓展】————26、File Upload XSS
    66、Redis 未授权访问配合 SSH key 文件利用分析
    【XSS技巧拓展】————25、Transcending Context-Based Filters
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551232.html
Copyright © 2011-2022 走看看