十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
最近看Android FrameWork层代码,看到了ThreadLocal这个类,有点儿陌生,就翻了各种相关博客一一拜读;自己随后又研究了一遍源码,发现自己的理解较之前阅读的博文有不同之处,所以决定自己写篇文章说说自己的理解,希望可以起到以下作用:
- 可以疏通研究结果,加深自己的理解;
- 可以起到抛砖引玉的作用,帮助感兴趣的同学疏通思路;
- 分享学习经历,同大家一起交流和学习。
一、 ThreadLocal 是什么
ThreadLocal 是Java类库的基础类,在包java.lang下面;
官方的解释是这样的:
Implements a thread-local storage, that is, a variable for which each thread has its own value. All threads share the same ThreadLocal object, but each sees a different value when accessing it, and changes made by one thread do not affect the other threads. The implementation supports null values.
大致意思是:
可以实现线程的本地存储机制,ThreadLocal变量是一个不同线程可以拥有不同值的变量。所有的线程可以共享同一个ThreadLocal对象,但是不同线程访问的时候可以取得不同的值,而且任意一个线程对它的改变不会影响其他线程。类实现是支持null值的(可以在set和get方法传递和访问null值)。
概括来讲有三个特性:
- 不同线程访问时取得不同的值
- 任意线程对它的改变不影响其他线程
- 支持null
下面分别对这些特性进行实例验证,首先定义一个Test类,在此类中我们鉴证上边所提到的三个特性。类定义如下:
Test.java
public class Test{ //定义ThreadLocal private static ThreadLocal name; public static void main(String[] args) throws Exception{ name = new ThreadLocal(); //Define Thread A Thread a = new Thread(){ public void run(){ System.out.println("Before invoke set,value is:"+name.get()); name.set(“Thread A”); System.out.println("After invoke set, value is:"+name.get()); } } ; //Define Thread B Thread b = new Thread(){ public void run(){ System.out.println("Before invoke set,value is :"+name.get()); name.set(“Thread B”); System.out.println("After invoke set,value is :"+name.get()); } } ; // Not invoke set, print the value is null System.out.println(name.get()); // Invoke set to fill a value name.set(“Thread Main”); // Start thread A a.start(); a.join(); // Print the value after changed the value by thread A System.out.println(name.get()); // Start thread B b.start(); b.join(); // Print the value after changed the value by thread B System.out.println(name.get()) } }