Java源码阅读(三)—— ThreadLocal

ThreadLocal,叫做线程本地存储,也可以叫做线程本地变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

一、如何使用

class Accessor implements Runnable {

    private final int id;

    public Accessor(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            ThreadLocalVariableHolder.increment();
            System.out.println(this);
            Thread.yield();
        }
    }

    public String toString() {
        return "#" + id + ":" + ThreadLocalVariableHolder.get();
    }
}


public class ThreadLocalVariableHolder {

    private static ThreadLocal<Integer> value = new ThreadLocal<Integer>() {
        protected synchronized Integer initialValue() {
            return 10000;
        }
    };

    public static void increment() {
        value.set(value.get() + 1);
    }


    public static int get() {
        return value.get();
    }

    public static void main(String[] args) throws InterruptedException {
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 3; i++) {
            exec.execute(new Accessor(i));
        }
        TimeUnit.SECONDS.sleep(1);
        exec.shutdownNow();
    }


}

在这里插入图片描述

二、什么场景下使用

需要避免任务在共享资源上产生冲突。

三、源码分析

3.1 WeakReference

讲到弱引用,就需要知道其他的几个引用。在Java中有4种引用:

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

简单说下区别,①如果对象有强引用,则垃圾回收器不会回收它;
②如果对象有软引用,只有在内存空间不足,才会被回收。
③如果对象有弱引用,则每次垃圾回收时,对象都会被回收。
④虚引用不影响对象的生命周期。

为什么要有这几种引用?

  • 提供通过代码的方式决定对象的生命周期
  • 有利于垃圾回收

弱引用如何使用

3.2 ThreadLocalMap

posted @ 2019-05-13 07:19  清泉白石  阅读(183)  评论(0编辑  收藏  举报