原文链接 作者:Jakob Jenkov   查看全部文章

Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作。因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量域。

1、创建一个ThreadLocal对象

2、访问ThreadLocal对象

3、ThreadLocal泛型

4、初始化ThreadLocal

5、Full ThreadLocal Example

6、InheritableThreadLocal

1、创建一个ThreadLocal对象

如下所示,创建一个ThreadLocal变量:

private ThreadLocal myThreadLocal = new ThreadLocal();

你实例化了一个ThreadLocal对象。每个线程仅需要实例化一次即可。虽然不同的线程执行同一段代码时,访问同一个ThreadLocal变量,但是每个线程只能看到私有的ThreadLocal实例。所以不同的线程在给ThreadLocal对象设置不同的值时,他们也不能看到彼此的修改。

2、访问ThreadLocal对象

一旦创建了一个ThreadLocal对象,你就可以通过以下方式来存储此对象的值:

myThreadLocal.set("A thread local value");

也可以直接读取一个ThreadLocal对象的值:

String threadLocalValue = (String) myThreadLocal.get();

get()方法会返回一个Object对象,而set()方法则依赖一个Object对象参数。

3、ThreadLocal泛型

为了使get()方法返回值不用做强制类型转换,通常可以创建一个泛型化的ThreadLocal对象。以下就是一个泛型化的ThreadLocal示例:

private ThreadLocal myThreadLocal1 = new ThreadLocal<String>();

现在你可以存储一个字符串到ThreadLocal实例里,此外,当你从此ThreadLocal实例中获取值的时候,就不必要做强制类型转换。

myThreadLocal1.set("Hello ThreadLocal");
String threadLocalValues = myThreadLocal.get();

4、初始化ThreadLocal

由于ThreadLocal对象的set()方法设置的值只对当前线程可见,那有什么方法可以为ThreadLocal对象设置的值对所有线程都可见。

为此,我们可以通过ThreadLocal子类的实现,并覆写initialValue()方法,就可以为ThreadLocal对象指定一个初始化值。如下所示:

private ThreadLocal myThreadLocal = new ThreadLocal<String>() {@Override protected String initialValue() {return "This is the initial value";}
};

此时,在set()方法调用前,当调用get()方法的时候,所有线程都可以看到同一个初始化值。

5、Full ThreadLocal Example

以下是一个完整的ThreadLocal示例:

public class ThreadLocalExample {public static class MyRunnable implements Runnable {private ThreadLocal<Integer> threadLocal =new ThreadLocal<Integer>();@Overridepublic void run() {threadLocal.set( (int) (Math.random() * 100D) );try {Thread.sleep(2000);} catch (InterruptedException e) {}System.out.println(threadLocal.get());}}public static void main(String[] args) {MyRunnable sharedRunnableInstance = new MyRunnable();Thread thread1 = new Thread(sharedRunnableInstance);Thread thread2 = new Thread(sharedRunnableInstance);thread1.start();thread2.start();thread1.join(); //wait for thread 1 to terminatethread2.join(); //wait for thread 2 to terminate}}

上面创建了两个线程共享一个MyRunnable实例。每个线程执行run()方法的时候,会给同一个ThreadLocal实例设置不同的值。如果调用set()方法的时候用synchronized关键字同步,而且不是一个ThreadLocal对象实例,那么第二个线程将会覆盖第一个线程所设置的值。

然而,由于是ThreadLocal对象,所以两个线程无法看到彼此的值。因此,可以设置或者获取不同的值。

6、InheritableThreadLocal

InheritableThreadLocal类是ThreadLocal的子类。为了解决ThreadLocal实例内部每个线程都只能看到自己的私有值,所以InheritableThreadLocal允许一个线程创建的所有子线程访问其父线程的值。

《Java并发性和多线程介绍》-Java TheadLocal相关推荐

  1. Java TheadLocal

    原文链接 作者:Jakob Jenkov   查看全部文章 Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作.因此,尽管有两个线程同时执行一段相同的代码,而且这段代码 ...

  2. 内存泄露的原因找到了,罪魁祸首居然是 Java TheadLocal

    作者 | 雷架 来源 | 爱笑的架构师(ID:DancingOnYourCode) ThreadLocal使用不规范,师傅两行泪 组内来了一个实习生,看这小伙子春光满面.精神抖擞.头发微少,我心头一喜 ...

  3. 看大众点评如何通过实时监控系统CAT打造7*24服务

    为什么80%的码农都做不了架构师?>>>    看大众点评如何通过实时监控系统CAT打造7*24服务 2015-06-08  尤勇  高可用架构 https://github.com ...

  4. 给HttpClient添加Socks代理

    本文描述http client使用socks代理过程中需要注意的几个方面:1,socks5支持用户密码授权:2,支持https:3,支持让代理服务器解析DNS: 使用代理创建Socket 从原理上来看 ...

  5. 多线程常见问题及分析

    1.多线程的并发性和多线程介绍: 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的"同一时间点 ...

  6. “1024”征文活动结果新鲜出炉!快来看看是否榜上有名?~~

    活动官网:https://marketing.csdn.net/p/d4ac23c33971a1297ff60aa7784f4b3a 一."最技术"奖 文章作者 文章标题 文章链接 ...

  7. Java的TheadLocal使用

    很多时候,当我们需要存储线程私有变量或者要实现线程安全的变量时或者想减少线程资源竞争的时候,可以使用ThreadLocal来为每个线程存储对应的私有变量.但是,如果你使用不当,会有可能造成严重的问题, ...

  8. java.lang.ThreadLocal实现原理和源码分析

    java.lang.ThreadLocal实现原理和源码分析 1.ThreadLocal的原理:为每一个线程维护变量的副本.某个线程修改的只是自己的副本. 2.ThreadLocal是如何做到把变量变 ...

  9. Java中的ThreadLocal的使用--学习笔记

    ThreadLocal直译为"线程本地"或"本地线程",如果你真的这么认为,那就错了!其实它就是一个容器,用于存放线程的局部变量,我认为应该叫做ThreadLo ...

最新文章

  1. C++ sort函数的用法
  2. 浅析php反序列化字符串逃逸
  3. windows下远程连接Linux桌面
  4. SOFAStack的前世今生
  5. 【AI视野·今日Sound 声学论文速览 第三期】Wed, 20 Apr 2022
  6. matlab isa函数,使用函数编写简单测试用例
  7. LINUX入侵检测指导
  8. vue一级分类和耳机分类_微服务项目第13天:商品分类业务的实现
  9. 用Linux同时编辑两个文档,如何使用Vim编辑多个文件
  10. ASP.NET Core 源码学习之 Logging[4]:FileProvider
  11. 不用IIS跑.net web应用
  12. 2019年5月的Flag!
  13. canvas+websocket+vue做一个你画我猜小游戏
  14. 学生课堂随机点名系统小结
  15. STM32 NXP 单片机MCU - bootloader不完全概述教程
  16. 软件调试修炼之道之——山重水复疑无路
  17. 城市天际线 for Mac城市建造类游戏
  18. pandas数据合并与重塑(pd.concat篇)
  19. 第一个项目的大概流程
  20. 网页访问的服务器和端口怎么查,怎么查看网页访问端口号

热门文章

  1. asp.net利用RAR实现文件压缩解压缩(转)
  2. 新的一年到来了,我要做的第一件事是放弃……
  3. Golang——Json的序列化和反序列化
  4. 九年级计算机上册教学总结,九年级信息技术教学工作总结
  5. java中的STL库_C++11 STL线程库实现一个简单的线程池
  6. android surfaceview 技术,Android中SurfaceView的理解和使用
  7. 第五部分 自定义的Calendar接口示例
  8. 互联网晚报 | 3月26日 星期六 |​ 竞拍规则优化,部分城市土地市场有所回暖;​​武汉房贷利率下调...
  9. 面试这些公司是在浪费时间
  10. linux qt应用程序全屏,QT中MDI应用程序中更改子窗口大小或是全屏显示子窗口的方法...