【Java并发编程的艺术】【学习笔记】ThreadLocal与Fork/Join

本文介绍了Java并发编程中的ThreadLocal机制,它为每个线程提供独立的变量副本,避免多线程共享状态的问题。同时讲解了ThreadLocal的四个主要方法:get、initialValue、remove和set。此外,文章还探讨了ThreadLocalMap的实现以及内存泄露问题的解决方案。接着,文章转向Fork/Join框架,解释了其基于“分治”的工作窃取算法,以及ForkJoinPool、ForkJoinTask和ForkJoinWorkerThread等核心类的工作原理和异常处理机制。
摘要由CSDN通过智能技术生成

5、其他

5.1、ThreadLocal

​ 一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关。其思路是为每个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程对应的副本。

​ ThreadLocal不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一种机制。

ThreadLocal的四个方法:

get():返回此线程局部变量的当前线程副本中的值。

initialValue():返回此线程局部变量的当前线程的“初始值”。

remove():移除此线程局部变量当前线程的值。

set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。

Get方法:

public T get() {
  Thread t = Thread.currentThread();//获取当前线程
  ThreadLocalMap map = getMap(t); //返回t.threadLocals,当前线程中局部变量ThreadLocalMap
  if (map != null) {
  //当前线程中有ThreadLocalMap
    ThreadLocalMap.Entry e = map.getEntry(this);//根据当前线程获取Map中的Entry,Key是ThreadLocal,value是值
    if (e != null) {
      @SuppressWarnings("unchecked")
      T result = (T)e.value;
      return result;
    }
  }
  return setInitialValue();
}

static class Entry extends WeakReference<ThreadLocal<?>> {
  /** The value associated with this ThreadLocal. */
  Object value;
  Entry(ThreadLocal<?> k, Object v) {
    super(k);
    value = v;
  }
}
//初始化ThreadLocalMap 和 Entry
private T setInitialValue() {
  T value = initialValue();
  Thread t = Thread.currentThread();
  ThreadLocalMap map = getMap(t);
  if (map != null)
    map.set(this, value);
  else
    createMap(t, value);
  return value;
}

initialValue方法:

protected T initialValue() { //new ThreadLocal的时候初始化
  return null;
}

remove方法:

public void remove() {
  ThreadLocalMap m = getMap(Thread.currentThread());
  if
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值