参看《实战JAVA高并发程序设计》P148

    使用ThreadLocal可以解决某些不能用于并发程序设计的类的问题

    • 可以将ThreadLocal理解成ThreadLocal
    • 若需要移除“所有线程”在ThreadLocal中的对象,那么可以通过 ThreadLocal.remove()或将变量赋值为null
    • 当多线程环境下的大多数情况下,多线程使用同一个变量的速度远远不如为每一个线程创建这个变量的速度快。

    示例代码

    1. package concurrent;
    2. public class C07_ThreadLocal {
    3. public static class Task implements Runnable{
    4. public String name;
    5. public static ThreadLocal<String> tl = new ThreadLocal<>();
    6. public Task(String name, boolean sleep) throws InterruptedException {
    7. this.name = name;
    8. if(sleep)
    9. Thread.sleep(1000);
    10. //构造函数设置ThreadLocal里的对象也是不行的
    11. tl.set(name);
    12. }
    13. @Override
    14. public void run() {
    15. System.out.println(name + ".tl.get():" + tl.get());
    16. tl.set("set by " + name);
    17. }
    18. }
    19. public static void main(String[] args) throws InterruptedException {
    20. //1.设置Task的静态变量tl
    21. Task.tl.set("set by main");
    22. //2.创建两个副线程并打印
    23. Thread one = new Thread(new Task("One", false));
    24. Thread two = new Thread(new Task("Two", true));
    25. one.start(); two.start();
    26. one.join(); two.join();
    27. //移除当前线程ThreadLocal所存储的对象(所有线程)
    28. System.out.println("before remove in main: " + Task.tl.get());
    29. Task.tl.remove(); //或者Task.tl = null;
    30. System.out.println(" after remove in main: " + Task.tl.get());
    31. /*
    32. .程序运行结果显示:
    33. .
    34. */
    35. }
    36. }

    console

    1. One.tl.get():null
    2. Two.tl.get():null
    3. before remove in main: Two
    4. after remove in main: null

    可以看出静态ThreadLocal通过get(),set()所操作的对象是每一个线程所独享的。