前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Threadlocal是什么,有什么用

Threadlocal是什么,有什么用

作者头像
smallmayi
发布2022-05-12 11:18:42
5660
发布2022-05-12 11:18:42
举报
文章被收录于专栏:small专栏
Threadlocal定义

Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。

Threadlocal的使用场景

就是当我们只想在本身的线程内使用的变量,可以用 ThreadLocal 来实现,并且这些变量是和线程的生命周期密切相关的,线程结束,变量也就销毁了。 所以说 ThreadLocal 不是为了解决线程间的共享变量问题的,如果是多线程都需要访问的数据,那需要用全局变量加同步机制。 例如: 比如用来存储用户 Session。Session 的特性很适合 ThreadLocal ,因为 Session 之前当前会话周期内有效,会话结束便销毁。 通过threadlocal 传递session,token等。

ThreadLocal常见用途:

1.存放当前session用户 2.存放一些context变量,比如webwork的ActionContext 3.存放session,比如Spring hibernate orm的session

Threadlocal接口方法
代码语言:javascript
复制
 void set(Object value)设置当前线程的线程局部变量的值。

 public Object get()该方法返回当前线程所对应的线程局部变量。

 public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

 protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。
Threadlocal 和线程同步比较

线程同步机制通过对象的锁机制保证同一时间只有一个线程去访问变量,该变量时多个线程共享的。ThreadLocal则为每一个线程提供了一个变量副本,从而隔离了多个线程访问数据的冲突,ThreadLocal提供了线程安全的对象封装,在编写多线程代码时,可以把不安全的代码封装进ThreadLocal。概括的说,对于多线程资源共享的问题,线程同步机制采取了时间换空间的方式,访问串行化,对象共享化;而ThreadLocal采取了空间换时间的方式,访问并行化,对象独享化。 都是为了解决多线程中的对同一变量的访问冲突,但是面向方向不同:同步机制需要共享该资源,操作该资源,而ThreadLocal 是在不同线程建立不同的变量副本,不对原资源操作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Threadlocal定义
  • Threadlocal的使用场景
  • Threadlocal接口方法
  • Threadlocal 和线程同步比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档