java 多线程-ThreadLocal

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 多线程-ThreadLocal相关的知识,希望对你有一定的参考价值。

ThreadLocal:每个线程自身的存储本地、局部区域,类似于容器,每个线程都会在其中有一定存储空间
常用的方法get/set/initialValue
官方建议为private static
每个线程存储自己的数据,更改不会影响其他线程
ThreadLocal 子类InheritableThreadLocal:
继承上下文环境的数据

    public class my 

//Integer 初始值为null
//private static ThreadLocal<Integer> threadlocal=new ThreadLocal<>();
//更改初始值需要创建ThreadLocal的子类重写initialValue或者使用lambda(jdk8)
private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>()
        //父类匿名内部类重写方法
            protected Integer initialValue()
            
                return 200;
            
        ;
//private static ThreadLocal<Integer> threadlocal=new ThreadLocal.withInitial(()->200);

public static void main(String[]args) throws InterruptedException

    //获取值
    System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
    //设置值
    threadlocal.set(99);
    System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());

    new Thread(new test()).start();
    new Thread(new test()).start();


public static class test implements Runnable

    public void run()
    
        threadlocal.set((int)(Math.random()*100));
        System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
    


每个线程自身的数据更改不会影响其他线程

public class my 

private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>()
        //父类匿名内部类重写方法
            protected Integer initialValue()
            
                return 1;
            
        ;

public static void main(String[]args) throws InterruptedException

    for(int i=0;i<5;i++)
    
        new Thread(new test()).start();
    


public static class test implements Runnable

    public void run()
    
        //修改不会影响其他线程
        Integer left=threadlocal.get();
        System.out.println(Thread.currentThread().getName()+"-->"+left);
        threadlocal.set(left-1);
        System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get());
    


分析ThreadLocal运行环境:

public class my 

private static ThreadLocal<Integer> threadlocal=new ThreadLocal <Integer>()
        //父类匿名内部类重写方法
            protected Integer initialValue()
            
                return 1;
            
        ;

public static void main(String[]args) throws InterruptedException

    new Thread(new test()).start();//两个打印的内容在不同的线程里
    //当start()之后,线程才从main转换到其他线程,所以构造器里的是main线程的


public static class test implements Runnable

    public test()
    
        threadlocal.set(100);  //属于main线程,修改不会影响start内的线程
        System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
    
    public void run()
    
        System.out.println(Thread.currentThread().getName()+"还剩下"+threadlocal.get());
    


子类InheritableThreadLocal:

public class my 

private static ThreadLocal<Integer> threadlocal=new InheritableThreadLocal<>();

public static void main(String[]args) throws InterruptedException

    System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
    threadlocal.set(2);

    //此线程由main线程开辟,拷贝一份main线程的数据给此线程
    //即将main线程里的2给此线程
    new Thread(()->
        System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
        threadlocal.set(200);
        System.out.println(Thread.currentThread().getName()+"-->"+threadlocal.get());
    ).start();


以上是关于java 多线程-ThreadLocal的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程 4.线程池

什么是JAVA的多线程?

Java多线程 1.认识Java线程

Java多线程 5.栅栏

java 如何实现多线程

java中啥叫做线程?啥叫多线程?多线程的特点是啥