线程:类ThreadLocal的使用

  类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。

   方法get()和null

public class Run {
    private static ThreadLocal tl = new ThreadLocal();

    public static void main(String[] args) {
        if(tl.get() == null){
            System.out.println("从未放过值");
            tl.set("我的值");
        }

        System.out.println(tl.get());
        System.out.println(tl.get());
    }
}

解决get()返回null问题

public class ThreadLocalExt extends ThreadLocal{

    @Override
    protected Object initialValue() {

        return "我是默认值,第一次get不再为null";
    }
}

public class Run {
    private static ThreadLocalExt tl = new ThreadLocalExt();

    public static void main(String[] args) {
        if(tl.get() == null){
            System.out.println("从未放过值");
            tl.set("我的值");
        }

        System.out.println(tl.get());
        System.out.println(tl.get());
    }
}

 线程变量的隔离性

public class Tools {
    public static ThreadLocal tl = new ThreadLocal();
}


public class ThreadA extends Thread{

    @Override
    public void run() {
        try {
            for (int i = 0; i < 100; i++) {
                Tools.tl.set("ThreadA"+(i+1));
                System.out.println("ThreadA get value="+Tools.tl.get());
                Thread.sleep(200);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}


public class ThreadB extends Thread{

    @Override
    public void run() {
        try {
            for (int i = 0; i < 100; i++) {
                Tools.tl.set("ThreadB"+(i+1));
                System.out.println("ThreadB get value="+Tools.tl.get());
                Thread.sleep(200);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}


public class Run {

    public static void main(String[] args) {

        try {
            ThreadA a = new ThreadA();
            ThreadB b = new ThreadB();
            a.start();
            b.start();
            for (int i = 0; i < 100; i++) {
                Tools.tl.set("main"+(i+1));
                System.out.println("main get value="+Tools.tl.get());
                Thread.sleep(200);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
发布了557 篇原创文章 · 获赞 40 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/m0_37564426/article/details/103436536
今日推荐