当前位置: 首页 > news >正文

名字做头诗的网站黑龙江建设网官方

名字做头诗的网站,黑龙江建设网官方,织梦和wordpress哪个,自己做的网站图片加载过慢ThreadLocal 用于存储线程本地的变量#xff0c;如果创建了一个 ThtreadLocal 变量#xff0c;在多线程访问这个变量的时候#xff0c;每个线程都会在自己线程的本地内存中创建一份变量的副本#xff0c;从而起到线程隔离的作用。 Thread、ThreadLocal、ThreadLocalMap 之…ThreadLocal 用于存储线程本地的变量如果创建了一个 ThtreadLocal 变量在多线程访问这个变量的时候每个线程都会在自己线程的本地内存中创建一份变量的副本从而起到线程隔离的作用。 Thread、ThreadLocal、ThreadLocalMap 之间的关系 每一个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals它存储本线程所有的ThreadLocal对象及其对应的值. ThreadLocalMap由一个个的Entrykey,value对象构成Entry继承自weakReferenceThreadLocal?一个Entry由ThreadLocal对象和Object构成。 Entry 的 key 是ThreadLocal对象并且是一个弱引用。当指向key的强引用消失后该key就会被垃圾收集器回收。 Entry 的 value 是对应的变量值Object 对象。 当执行set方法时ThreadLocal首先会获取当前线程 Thread 对象然后获取当前线程的ThreadLocalMap对象再以当前ThreadLocal对象为key获取对应的 value。 由于每一条线程均含有各自私有的 ThreadLocalMap 对象这些容器相互独立互不影响因此不会存在线程安全性问题从而也就无需使用同步机制来保证多条线程访问容器的互斥性。 ThreadLocal 使用场景 1、在进行对象跨层传递的时候使用ThreadLocal可以避免多次传送打破层次间的约束。 即如果一个User对象需要从Controller层传到Service层再传到Dao层那么把User放在ThreadLocal中每次使用ThreadLocal来进行获取即可 2、线程间数据隔离 3、进行事务操作用于存储线程事务信息 4、数据库连接Session会话管理 ThreadLocal 的内存泄漏问题 这里假设将 ThreadLocal 定义为方法中的局部变量那么当线程进入该方法的时候就会将 ThreadLocal 的引用给加载到线程的栈 Stack 中。 如上图所示在线程栈 Stack 中有两个变量ThreadLocalRef 和 CurrentThreadRef分别指向了声明的局部变量 ThreadLocal 以及当前执行的线程。 而 ThreadLocalMap 中的 key 是弱引用当线程执行完该方法之后Stack 线程栈中的 ThreadLocalRef 变量就会被弹出栈因此 ThreadLocal 变量的强引用消失了那么 ThreadLocal 变量只有 Entry 中的 key 对他引用并且还是弱引用因此这个 ThreadLocal 变量会被回收掉导致 Entry 中的 key 为 null而 value 还指向了对 Object 的强引用因此 value 还一直存在。 ThreadLocalMap 变量中由于 ThreadLocal 被回收了无法通过 key 去访问到这个 value导致这个 value 一直无法被回收ThreadLocalMap 变量的生命周期是和当前线程的生命周期一样长的只有在当前线程运行结束之后才会清除掉 value因此会导致这个 value 一直停留在内存中导致内存泄漏。 当然 JDK 的开发者想到了这个问题在使用 set get remove 的时候会对 key 为 null 的 value 进行清理使得程序的稳定性提升。 当然我们要保持良好的编程习惯在线程对于 ThreadLocal 变量使用的代码块中在代码块的末尾调用 remove 将 value 的空间释放防止内存泄露。 ThearLocal 内存泄漏的根源是 由于 ThreadLocalMap 的生命周期跟 Thread 一样长如果没有手动删除对应 key 就会导致内存泄漏。 ThreadLocal 正确的使用方法 每次使用完 ThreadLocal 都调用它的 remove() 方法清除数据 将 ThreadLocal 变量定义成 private static final这样就一直存在 ThreadLocal 的强引用也能保证任何时候都能通过 ThreadLocal 的弱引用访问到 Entry 的 value 值进而清除掉。 下面给出 ThreadLocal 的用法 public class ThreadLocalExample {private static final ThreadLocalInteger counter new ThreadLocalInteger() {Overrideprotected Integer initialValue() {return 0;}};public static void main(String[] args) {Thread t1 new Thread(() - {try {int value counter.get(); // 获取当前线程的副本值counter.set(value 1); // 修改副本值System.out.println(Thread Thread.currentThread().getName() value: counter.get());} finally {// 手动移除counter.remove(); // 在线程结束时移除变量}});Thread t2 new Thread(() - {try {int value counter.get();counter.set(value 1);System.out.println(Thread Thread.currentThread().getName() value: counter.get());} finally {// 手动移除counter.remove();}});t1.start();t2.start();} } 那么 ThreadLocal 为什么要将 key 设计为弱引用呢 这里还要看一下具体是如何使用 ThreadLocal 了 如果定义 ThreadLocal 为局部变量那么这个 ThreadLocal 对象就会放在堆中如果不手动 remove() 的话当线程执行完当前方法退出时这个局部变量对 ThreadLocal 的强引用就消失了只剩下 Thread.ThreadLocalMap 中的 key 对 ThreadLocal 的弱引用因此会将 ThreadLocal 给回收掉而 value 还存在强引用而我们没有了 TheadLocal 的引用导致访问不到 value导致 value 无法回收因此 JDK 设计者在 ThreadLocal 还添加了清除。 ThreadLocalMap 中 key 为 null 的 value避免内存泄漏这是在设计时为了避免内存泄漏而采取的措施而我们使用的时候要保持良好的编程规范也要手动去 remove避免内存泄露的发生。 如果定义 ThreadLocal 为 private static final那么这个 ThreadLocal 就会在常量池中存储而不是存储在堆中这时候要考虑的问题是当前线程在使用完 ThreadLocal 之后要主动 remove 避免出现脏数据而不是内存泄漏问题因为我们可以随时通过该 ThreadLocal 去访问到 ThreadLocalMap 中的 value 值并随时进行回收因此不会存在内存泄漏因为在多线程的环境中如果上一个线程使用完 ThreadLocal 之后并没有 remove下一个线程来使用时可能会拿到上个线程的数据产生了脏数据。 总结 那么这里总结一下将 ThreadLocal 定义为局部变量会导致方法执行完之后 ThreadLocal 被回收而 value 没有被回收导致无法通过 key 访问到这个 value导致内存泄漏。 如果规范使用将 ThreadLocal 定义为 private static final那么这个 ThreadLocal 不会被回收可以随时通过这个 ThreadLocal 去访问到 value随时可以手动回收因此不会内存泄漏但是会导致脏数据。 所以在 ThreadLocal 的内存泄漏问题主要是针对将 ThreadLocal 定义为局部变量的时候如果不手动 remove 可能会导致 ThreadLocalMap 中的 Entry 对象无法回收一直占用内存导致内存泄漏直到当前 Thread 结束之后才会被回收。
http://www.zqtcl.cn/news/263397/

相关文章:

  • 学生求职网站的需求分析怎么做江西手机版建站系统开发
  • 电商网站开发文献综述嵌入式软件开发项目
  • 网站备案怎样提交管局网站建设基本步骤
  • 国外优秀电商设计网站开发网站公司推荐
  • 国外企业网站建设模型网站建设谈客户说什么
  • 肖港网站开发公司网站的用途
  • 百度网站置顶怎么做效果图制作设计
  • 自适应企业网站用什么框架做重庆在线观看
  • 网站做301重定向的作用辽宁网站建设电话
  • 抚州市建设局官方网站高端网页设计人才
  • 移动商城网站建设 深圳北京网站建站公
  • 网站的对比免费网站建设排名
  • 织梦做的网站别人提交给我留的言我去哪里看怎样发展网站
  • 滨州公司网站建设推广地下城做解封任务的网站
  • 做国外的众筹网站北京的网站建设公司哪家好
  • 网站建设费用一年多少钱商洛城乡建设局网站
  • 网站视觉设计原则四个商城建设
  • WordPress站点添加ssl证书网站在百度无法验证码怎么办
  • 做ppt图片用的网站有哪些问题搭建网站合同
  • 杭州网站建设推荐q479185700上墙网站推广费用入什么科目
  • 天津网站建设 熊掌号设计网站大全
  • 网站建设不力 被问责上海传媒公司有哪些
  • 在线购物网站的设计阿里巴巴网站建设
  • 宿迁网站制作公司河北省建设工程协会网站
  • 美丽寮步网站建设做招聘的网站有哪些内容
  • 服装商店的网站建设要求企业所得税率
  • 南联网站建设公司注册企业查询
  • 商业网站的网址买网站服务器吗
  • 专业的单位网站开发网站开发和网页开发有什么区别
  • 电子商务网站建设 概念免费网页设计制作网站