zoukankan      html  css  js  c++  java
  • ThreadLocal使用注意

    ThreadLocal<T>的出现是一种空间换时间的思想的运用,是为了多线程环境下单线程内变量共享的问题。它的原理就是每个线程通过ThreadLocal.ThreadLocalMap,保存当前线程中所有ThreadLocal变量引用的key和值。相当于每个线程有各自的变量副本,线程内共享这个变量数据,线程间互不影响。

    ThreadLocal<T>有它自己的使用场景,比如Spring中用它了解决Session、Connection等多线程并发访问问题,但不能它不能用来代替为了解决多线程安全问题的同步关键字,因为它实际上没有多线程间的变量共享,而线程安全问题是指多线程间变量共享,且共享变量可修改,进而可能会出现多线程并发修改共享变量的问题,这种需要通过同步手段解决。

    ThreadLocal<T>变量一般要声名成static类型,即当前线程中只有一个T类型变量的实例,线程内可共享该实例数据且不会出问题,如将其声名成非static,则一个线程内就存储多个T类型变量的实例,有点存储空间的浪费,一般很少有这样的应用场景。另外根据实际情况,ThreadLocal变量声名时也多加上private final关键词表明它时类内私有、引用不可修改。

    在线程池环境下,由于线程是一直运行且复用的,使用ThreadLocal<T>时会出现这个任务看到上个任务ThreadLocal变量值以及内存泄露等问题,解决方法就是在当前任务执行完后将ThreadLocal变量remove或设置为初始值,类似在Struts2 框架中Filter里的处理方法。

  • 相关阅读:
    sql mdf文件被破坏,ldf完好的情况下恢复数据库
    网站开发人员应该知道的61件事
    Myeclipse6.5中安装maven
    Java常用的一些正则表达式验证
    jQuery中$.ajax()方法中参数详解
    Pro Silverlight 3 in C# Layout
    Pro Silverlight 3 in C# XAML
    bugtracker.net 3.4.0 简易汉化手记+汉化文件下载
    IBatisNet In 参数配置方法
    Pro Silverlight 3 in C# XAML Resources
  • 原文地址:https://www.cnblogs.com/doit8791/p/8078444.html
Copyright © 2011-2022 走看看