ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

juc之ThreadLocal

2021-07-08 19:32:48  阅读:196  来源: 互联网

标签:juc set ThreadLocalMap get ThreadLocal static public


并发工具类——分类

在这里插入图片描述

ThreadLocal

使用场景

在这里插入图片描述

典型场景1:初始化ThreadLocal,使得不安全的工具类线程安全

public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal 
= ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

在这里插入图片描述

典型场景2: 使用set在ThreadLocal中存入全局变量,在其他方法中使用get读取,避免参数传递

ThreadLocal的两个作用

在这里插入图片描述

ThreadLocal的好处

在这里插入图片描述
在这里插入图片描述

原理

在这里插入图片描述
在这里插入图片描述

public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;ThreadLocalMap
            }
        }
        return setInitialValue();
    }
  • 每个线程都有一个对应的ThreadLocalMap,在get方法中先获取当前线程对应的ThreadLocalMap,ThreadLocalMap中的键值对是当前的ThreadLocalMap和对应的内容,所以可以通过map.getEntry(this)获取对应的内容。
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
  • set方法与get方法相反

主要方法介绍

initialValue

在这里插入图片描述在这里插入图片描述

void set(T t) 和 T get()

在这里插入图片描述

void remove()

在这里插入图片描述

ThreadLocal注意点

内存泄露

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

空指针异常

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        System.out.println(ThreadLocalUtil.get());
    }
}

class ThreadLocalUtil {
    public static ThreadLocal<Long> longThreadLocal = new ThreadLocal<>();

    public static void set(Long num) {
        longThreadLocal.set(num);
    }

    public static long get() {
        return longThreadLocal.get();
    }

    public static void remove() {
        longThreadLocal.remove();共享对象
    }
}

以上代码会导致空指针异常,而不会输出null,这是因为get方法返回时进行了拆箱,无法对null进行拆箱,导致空指针异常。

其他注意点

![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210708在这里插入图片描述
在这里插入图片描述

实际应用场景

在这里插入图片描述

标签:juc,set,ThreadLocalMap,get,ThreadLocal,static,public
来源: https://blog.csdn.net/qq_33789406/article/details/118496017

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有