ThreadLocal 基本API

ThreadLocal 是什么呢?

  定义:提供线程局部变量; 一个线程局部变量在多个线程中,分别有独立的值(副本)。

  特点:简单(开箱即用)、快速(无额外开销)、安全(线程安全)。

  场景: 多线程场景(资源持有、线程一致性、并发计算、线程安全等场景)。

ThreadLocal 基本API

  构造函数ThreadLocal<T>()

  初始化initialValue()

  访问器get/set

  回收 remove

 

public class ThreadLocalTest {

   public static  ThreadLocal<String> s = new ThreadLocal<String>(){
       @Override
       protected String initialValue(){
           System.out.println("Initial Value run .........");
           return Thread.currentThread().getName();
       }

   };

   public  static  void main(String[] argv){
       System.out.println(s.get());
       s.set("good");
       System.out.println(s.get());
   }
}

结果:

Initial Value run .........
main
good

Process finished with exit code 0

1.initialValue只执行了一次,而且需要调用get()方法去触发。

下面的代码会让你更好的理解:一个线程局部变量在多个线程中,分别有独立的值(副本)

public class ThreadLocalTest {

   public static  ThreadLocal<String> s = new ThreadLocal<String>(){
       @Override
       protected String initialValue(){
           System.out.println("Initial Value run .........");
           return Thread.currentThread().getName();
       }

   };

   public  static  void main(String[] argv){

       System.out.println(s.get());
       s.set("good");
       new Thread(){
           @Override
           public void run(){
               System.out.println(s.get());

           }
       }.start();
       System.out.println(s.get());
   }
}

  

结果:

Initial Value run .........
main
good
Initial Value run .........
Thread-0

Process finished with exit code 0

 结果里面的

good   是代码 最后一行的输出。


在不同的线程里, 使用了get() 会触发 其initialValue方法。在另外的线程set值,不会影响其他线程。

一个线程局部变量在多个线程中,分别有独立的值(副本)

  

 

ThreadLocal 基本API

上一篇:一招教你如何在WPF界面开发时自定义外观,快来Get!


下一篇:【EF Core】EF core中使用FluentAPI对外键进行指定配置