• ThreadLocal


    作用

    ThreadLocal通过将对象封闭在线程之中,来解决多线程并发的安全性问题。每一个线程均有一个对象,线程只能访问自己的对象,这样,就不存在多线程并发处理单个对象的问题,也就解决了多线程并发的安全性问题。

    原理

    1. Thread对象中有threadLocalMap属性,该属性为map,保存线程所有的ThreadLocal的值。map的键为ThreadLocal本身,值为ThreadLocal对应的本线程的值。
    2. 在使用ThreadLocal时,ThreadLocal会先找到当前线程对象,然后操作当前线程对象的threadLocalMap。
     1     public T get() {
     2         Thread t = Thread.currentThread();
     3         ThreadLocalMap map = getMap(t);
     4         if (map != null) {
     5             ThreadLocalMap.Entry e = map.getEntry(this);
     6             if (e != null) {
     7                 @SuppressWarnings("unchecked")
     8                 T result = (T)e.value;
     9                 return result;
    10             }
    11         }
    12         return setInitialValue();
    13     }
    14 
    15     
    16     ThreadLocalMap getMap(Thread t) {
    17         return t.threadLocals;
    18     }
    1     public void set(T value) {
    2         Thread t = Thread.currentThread();
    3         ThreadLocalMap map = getMap(t);
    4         if (map != null)
    5             map.set(this, value);
    6         else
    7             createMap(t, value);
    8     }

    使用

     1 public class ThreadLocalTest {
     2     private static final ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
     3         @Override
     4         protected Integer initialValue() {
     5             return 0;
     6         }
     7     };
     8 
     9     private static class CountThread extends Thread {
    10         @Override
    11         public void run() {
    12             for (int i = 0;i < 50;i++) {
    13                 count.set(count.get() + 1);
    14             }
    15             System.out.println(count.get());
    16         }
    17     }
    18 
    19     public static void main(String[] args) {
    20         for (int i=0;i < 100;i++) {
    21             new CountThread().start();
    22         }
    23     }
    24 }
  • 相关阅读:
    jmeter之三种参数化
    linux(centos6.5)常用命令
    win10+jdk+mysql+tomcat+jpress环境搭建与部署
    [剑指Offer] 29.最小的K个数
    [C/C++] C++中new的语法规则
    [C/C++] 深拷贝和浅拷贝
    [C/C++] #ifdef和#endif
    [C/C++] C++声明和定义的区别
    [C/C++] extern关键字详解以及与static、const区别
    [C/C++] static在C和C++中的用法和区别
  • 原文地址:https://www.cnblogs.com/qhdxqxx/p/8876330.html
Copyright © 2020-2023  润新知