ThreadLocal

/*
ThreadLocal:使用空间换时间  效率更高
线程同步:使用时间换空间
 
 ThreadLocal可能会导致内存泄漏
 */
/**
 * ThreadLocal 线程局部变量
 */
public class ThreadLocal2 {

    static ThreadLocal<Person> p = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(p.get()); // 2. 虽然threadLocal时共享变量,但是取不到其他线程放入的值,所以此处为null
        }).start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            p.set(new Person()); // 1. 往线程局部变量放入一个person
        }).start();
    }
    
    static class Person {
        String name = "zhangsan";
    }
}

/*
ThreadLocal:使用空间换时间  效率更高
线程同步:使用时间换空间
 
 ThreadLocal可能会导致内存泄漏
 */

线程局部变量

/**
 * ThreadLocal 线程局部变量
 */
public class ThreadLocal1 {

    /*volatile*/ static Person p = new Person();

    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println(p.name);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(p.name);  // 在加与不加volatile的情况下,这句话打印的值分别是? 答:不写volatile有可能发生可见性问题
        }).start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            p.name = "lisi";
        }).start();
    }
    
    static class Person {
        String name = "zhangsan";
    }
}

/*

如果想要共享变量不可见呢?  就需要使用ThreadLocal
 */
原文地址:https://www.cnblogs.com/gxlaqj/p/11698223.html