标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。