H5W3
当前位置:H5W3 > java > 正文

【Java】Java线程封闭

  • Ad-hoc线程封闭:程序控制实现,非常脆弱,最糟糕,忽略。
  • 堆栈封闭:简单的说就是局部变量,无并发问题。多线程访问同一个方法时,方法中的局部变量会被拷贝一份到线程栈中。方法的局部变量不是被多线程共享的,不会出现线程安全问题,能用局部变量就不要用全局变量,全局变量容易发生并发问题,注意全局变量不是全局常量。
  • ThreadLocal线程封闭:Java中提供一个ThreadLocal类来实现线程封闭,这个类使线程中的某个值与保存值的对象关联起来

ThreadLocal

ThreadLocal类提供的方法

【Java】Java线程封闭

  • 创建:
private final static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>;
  • 创建并赋初始值
private final static ThreadLocal<String> threadLocal=new ThreadLocal<String>(){
@Override
protected String initialValue() {
return "入门小站";
}
};
  • 赋值
threadLocal.set("入门小站");
  • 取值
threadLocal.get();
  • 删除
threadLocal.remove();

实现原理

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;
}
}
return setInitialValue();
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

内存泄漏问题

【Java】Java线程封闭

内存泄漏解决方案

将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。

如何保证两个同时实例化的ThreadLocal对象有不同的threadLocalHashCode属性

ThreadLocal应用

场景一

场景二

【关注微信公众号:【入门小站】解锁更多知识点】
【Java】Java线程封闭

本文地址:H5W3 » 【Java】Java线程封闭

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址