【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线程封闭

以上是 【Java】Java线程封闭 的全部内容, 来源链接: utcz.com/a/94486.html

回到顶部