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

简单网上书店网站建设php衡水网站建设的地方

简单网上书店网站建设php,衡水网站建设的地方,重庆建站管理系统信息,360竞价推广怎么做1.原理 ThreadLocal是用来保存当前线程数据的,每一个线程的内部都有一个ThreadLocalMap,当前这个map中存储了以当前ThreadLocal作键,具体的数据作值的一个个Entry对象。 为什么非得以ThreadLocal对象作键呢?因为一个线程可能使用了…

1.原理

        ThreadLocal是用来保存当前线程数据的,每一个线程的内部都有一个ThreadLocalMap,当前这个map中存储了以当前ThreadLocal,具体的数据的一个个Entry对象。

                

        为什么非得以ThreadLocal对象作键呢?因为一个线程可能使用了不止一个ThreadLocal对象,如果以当前线程对象做键,再去找对应的ThreadLocal就很麻烦,产生混淆。

        由于每一个线程都有属于自己的ThreadLocal线程局部变量,所以很好的实现了线程之间的数据隔离ThreadLocal中保存的数据仅属于当前线程)。       

2.ThreadLocal中的常见方法:

        (1)存储数据        set()

        (2)获取数据        get()

        (3)清除数据         remove()

        那么问题来了,具体是怎样利用ThreadLocalMap查找数据的呢?不论是set()、get()、remove()等方法对当前map进行操作时,最终都定位到了通过计算出的下标来操作。

        而这个下标是通过哈希算法计算得到的,操作ThreadLocalMap是以当前的ThreadLocal作key,通过当前的key的HashCode值和Entry[]数组长度-1“&”运算,来计算出实际操作位置的下标,从而达到访问元素的目的。        

        作按位与运算的效果和利用哈希值直接进行取余%运算一样,但效率大大提高

3.如何实现父子线程共享数据?

        利用了jdk提供ThreadLocal的子类InheritableThreadLocal来实现。

public class ThreadLocalTest {public static void main(String[] args) {InheritableThreadLocal<String> threadLocal = new InheritableThreadLocal<String>();threadLocal.set("风萧萧兮易水寒");System.out.println("main主线程:"+threadLocal.get());Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("子线程:"+threadLocal.get());}});thread.start();}
}

        main函数为父线程,创建了一个thread子线程,利用InheritableThreadLocal这个子类来共享父线程的数据。

        父线程子线程均输出“风萧萧兮易水寒”。

4.ThreadLocal如何避免内存泄露

        执行完相关的业务逻辑后,最终在finally代码块中都会调用remove()方法,将当前map中的ThreadLocal键置为空,value置为空,从而在垃圾回收的时候及时回收无用数据。

5.应用

        (1) 线程的数据隔离

        因为ThreadLocal对象只属于当前线程,那么ThreadLocal中的数据也属于当前线程,在多线程并发的情况下,很好的实现了不同线程的数据隔离,避免了采用synchronized锁机制来保证线程安全而导致的性能上的代价。

        例如:SqlSession会话对象绑定,避免多个线程使用同一个SqlSession对象,由于关闭导致异常。

//当前线程的线程局部变量
private static final ThreadLocal threadSession= new ThreadLocal();public static SqlSession getSession(){//获取session会话方法SqlSession s = (SqlSession)threadSession.get();//通过仅属于当前线程的threadSession对象来获取if(s==null){//为空s = getSqlSessionFactory().openSqlSession();//则重新建立会话threadSession.set(s);//并存到ThreadLocalMap中去}
}

        (2)跨函数调用

        数据通常用于同一个类中的传递,如果利用方法传递势必要关心方法的返回值类型及参数,但利用ThreadLocal可以直接实现获取,这样做还达到了解耦的效果。

        例如:RequestContextHolder源码就有很好的体现

@Nullable  
public static RequestAttributes getRequestAttributes() {// 获取当前线程中的存储的Request Attribute//直接通过ThreadLocal对象来获取RequestAttributes attributes = requestAttributesHolder.get();  if (attributes == null) {  attributes = inheritableRequestAttributesHolder.get();  }  return attributes;  
}private static final ThreadLocal<RequestAttributes> requestAttributesHolder =  new NamedThreadLocal<>("Request attributes");  private static final ThreadLocal<RequestAttributes> inheritableRequestAttributesHolder =  new NamedInheritableThreadLocal<>("Request context");

以上就是我对ThreadLocal线程区域对象的粗略理解,欢迎诸君共同探讨。

http://www.yayakq.cn/news/679363/

相关文章:

  • 网站开发新技术温州市网站建设哪家公司好
  • 卖营销软件的网站宁波seo专员
  • 黄山市网站建设i18n wordpress
  • 工具站seo关键词优化步骤简短
  • 学校教育网站模板如何做国际贸易网站
  • 空间ip地址访问网站手机app设计软件有哪些
  • 网站模板编辑软件增城做网站要多少钱
  • 企业网站建站源码平面设计海报作品欣赏
  • 在国外建网站方便吗ui培训班 qfedu
  • 万州做网站多少钱企业网站的特点
  • 响应式网站建设方案东莞营销网站
  • 奢侈品网站模板中国核工业第二二建设有限公司招聘
  • 做网站的时候表格怎么去掉途牛的旅游网站是谁做的
  • 网站建设公司销售企业网站建设的几种形式
  • 商城网站开发多少钱有网站想修改里面的内容怎么做
  • 做像美团淘宝平台网站多少钱昆明 五华 网站建设
  • 网站建设seo推广网站地图 wordpress
  • 基础建站如何提升和优化金华网站定制公司
  • 最新军事战争新闻百度seo优化网站怎么做
  • 个人网站如何在工信部备案地区性门户网站是什么意思
  • 哪家企业网站建设好建设公共网站的手续
  • 如何学网站开发dedecms网站建设合同
  • 网站优化师招聘江门网站开发
  • 哪个建立网站好十款app软件下载入口
  • 铜仁市网站建设情况沈阳城市建设管理学校网站
  • 潮汕网站建设wordpress的阅读量
  • 一个网站如何做cdn加速中英双语网站怎么做
  • 建设工程有限公司 网站seo优化推广是什么意思
  • 成都网站建设推广港哥网站 盈利模式
  • 如何做微信商城网站农机局网站建设方案