【Java】Java线程封闭
- Ad-hoc线程封闭:程序控制实现,非常脆弱,最糟糕,忽略。
- 堆栈封闭:简单的说就是局部变量,无并发问题。多线程访问同一个方法时,方法中的局部变量会被拷贝一份到线程栈中。方法的局部变量不是被多线程共享的,不会出现线程安全问题,能用局部变量就不要用全局变量,全局变量容易发生并发问题,注意全局变量不是全局常量。
- ThreadLocal线程封闭:Java中提供一个
ThreadLocal
类来实现线程封闭,这个类使线程中的某个值与保存值的对象关联起来
ThreadLocal
ThreadLocal类提供的方法
- 创建:
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);
}
内存泄漏问题
内存泄漏解决方案
将ThreadLocal变量定义成private static的,这样的话ThreadLocal的生命周期就更长,由于一直存在ThreadLocal的强引用,所以ThreadLocal也就不会被回收,也就能保证任何时候都能根据ThreadLocal的弱引用访问到Entry的value值,然后remove它,防止内存泄露。
如何保证两个同时实例化的ThreadLocal对象有不同的threadLocalHashCode属性
ThreadLocal
应用
场景一
场景二
【关注微信公众号:【入门小站】解锁更多知识点】
以上是 【Java】Java线程封闭 的全部内容, 来源链接: utcz.com/a/94486.html