java之ThreadLocal简单使用总结

举报
chenyu 发表于 2021/07/26 23:21:40 2021/07/26
【摘要】 1、介绍ThreadLocal 看安卓源码的时候,在这个类Looper.java ,会有这个一句函数   static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); 一开始我不是很懂ThreadLocal.java这个类,简单理解 &nbsp...

1、介绍ThreadLocal

看安卓源码的时候,在这个类Looper.java ,会有这个一句函数

 

static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
 


一开始我不是很懂ThreadLocal.java这个类,简单理解

 

ThreadLocal 就是把变量分成很多个拷贝,每个线程拥有一个,比如说一个变量使用ThreadLocal修饰,则在线程中会创建这个变量的副本进行操作.操作不会受另外一个线程影响.

 

 

2、常用API

ThreadLocal.java

 

1、构造函数

 

public ThreadLocal() {}
 

 

 

2、initialValue函数

 


  
  1. protected T initialValue() {
  2. return null;
  3. }


3、get函数

 

public T get()
 

该函数用来获取与当前线程关联的ThreadLocal的值
如果当前线程没有该ThreadLocal的值,则调用initialValue函数获取初始值返回。

 

 

4、set函数

public void set(T value)
 

设置当前线程的ThreadLocal的值为value

 

 


5、remove函数

public void remove()
 

将当前线程的ThreadLocal绑定的值删除
在某些情况下需要手动调用该函数,防止内存泄露。

 

 

 

3、测试代码

 


  
  1. package com.sangfor.threadlocal;
  2. public class TestThreadLocal {
  3. public static final ThreadLocal<Integer> sThreadLocal = new ThreadLocal<Integer>(){
  4. @Override
  5. protected Integer initialValue() {
  6. return 0;
  7. }
  8. };
  9. public static void main(String[] args) {
  10. for (int i = 0; i < 10; i++) {
  11. new MyThread(i).start();
  12. }
  13. }
  14. static class MyThread extends Thread {
  15. public int index;
  16. public MyThread(int index) {
  17. this.index = index;
  18. }
  19. @Override
  20. public void run() {
  21. System.out.println("线程" + index + "的初始value:" + sThreadLocal.get());
  22. for (int i = 0; i < 10; i++) {
  23. sThreadLocal.set(sThreadLocal.get() + i);
  24. }
  25. System.out.println("线程" + index + "的累加value:" + sThreadLocal.get());
  26. }
  27. }
  28. }

 

 

 

 

 

4、运行结果

 


  
  1. 线程0的初始value:0
  2. 线程0的累加value:45
  3. 线程1的初始value:0
  4. 线程1的累加value:45
  5. 线程2的初始value:0
  6. 线程2的累加value:45
  7. 线程3的初始value:0
  8. 线程3的累加value:45
  9. 线程4的初始value:0
  10. 线程4的累加value:45
  11. 线程5的初始value:0
  12. 线程5的累加value:45
  13. 线程6的初始value:0
  14. 线程7的初始value:0
  15. 线程7的累加value:45
  16. 线程6的累加value:45
  17. 线程8的初始value:0
  18. 线程8的累加value:45
  19. 线程9的初始value:0
  20. 线程9的累加value:45

 

 

 

 

5、总结

用ThreadLocal修饰的变量,感觉就是每个线程都拥有一份原始数据的拷贝,每个线程只能修改自己的数据,其它线程不可以修改

 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/75770226

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。