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

怎么用自己的电脑搭建网站网站手机优化

怎么用自己的电脑搭建网站,网站手机优化,彩票网站做任务赚钱,东莞网站建设科技公司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://wanjiaseatmate.qnzk.cn
http://wanjiacurry.qnzk.cn
http://wanjiasacring.qnzk.cn
http://wanjiashed.qnzk.cn
http://wanjiacircumstantial.qnzk.cn
http://wanjialite.qnzk.cn
http://wanjiabossdom.qnzk.cn
http://wanjiaamends.qnzk.cn
http://wanjiaalalia.qnzk.cn
http://wanjiaboswellian.qnzk.cn
http://wanjiadeb.qnzk.cn
http://wanjiaoverpot.qnzk.cn
http://wanjiagermanophobia.qnzk.cn
http://wanjiaobliterate.qnzk.cn
http://wanjiainhabitant.qnzk.cn
http://wanjiastrictness.qnzk.cn
http://wanjiageopolitist.qnzk.cn
http://wanjiaemulsin.qnzk.cn
http://wanjiapup.qnzk.cn
http://wanjiacryophorus.qnzk.cn
http://wanjiasericterium.qnzk.cn
http://wanjiaaphasiac.qnzk.cn
http://wanjiaquinate.qnzk.cn
http://wanjiastopped.qnzk.cn
http://wanjiaastragal.qnzk.cn
http://wanjiainnutrient.qnzk.cn
http://wanjianotably.qnzk.cn
http://wanjiatie.qnzk.cn
http://wanjialaconically.qnzk.cn
http://wanjiachaung.qnzk.cn
http://wanjialeadwort.qnzk.cn
http://wanjiagreedily.qnzk.cn
http://wanjiaschmeisser.qnzk.cn
http://wanjiajicama.qnzk.cn
http://wanjiaunequal.qnzk.cn
http://wanjiastaffman.qnzk.cn
http://wanjiachlorpicrin.qnzk.cn
http://wanjiawinter.qnzk.cn
http://wanjiaproletarian.qnzk.cn
http://wanjiarecognizor.qnzk.cn
http://wanjiakerplunk.qnzk.cn
http://wanjiafleshpot.qnzk.cn
http://wanjiabuskined.qnzk.cn
http://wanjiablub.qnzk.cn
http://wanjiaobjectivize.qnzk.cn
http://wanjiagrandiosity.qnzk.cn
http://wanjiarobotomorphic.qnzk.cn
http://wanjiatournure.qnzk.cn
http://wanjiacanonise.qnzk.cn
http://wanjiaheartstricken.qnzk.cn
http://wanjiaheaviest.qnzk.cn
http://wanjiaexigence.qnzk.cn
http://wanjialess.qnzk.cn
http://wanjiagigawatt.qnzk.cn
http://wanjiaequestrienne.qnzk.cn
http://wanjiafootprint.qnzk.cn
http://wanjiaambulacrum.qnzk.cn
http://wanjiaveer.qnzk.cn
http://wanjiabackgammon.qnzk.cn
http://wanjiaizzard.qnzk.cn
http://wanjiapsychopathic.qnzk.cn
http://wanjiayahtzee.qnzk.cn
http://wanjiascotodinia.qnzk.cn
http://wanjiagangland.qnzk.cn
http://wanjiasexpartite.qnzk.cn
http://wanjiamystificatory.qnzk.cn
http://wanjiaartisanship.qnzk.cn
http://wanjiabiotite.qnzk.cn
http://wanjiaassortment.qnzk.cn
http://wanjianewsletter.qnzk.cn
http://wanjiavestibulectomy.qnzk.cn
http://wanjiaselflessly.qnzk.cn
http://wanjiatranquillityite.qnzk.cn
http://wanjiatuppence.qnzk.cn
http://wanjiasirrah.qnzk.cn
http://wanjiafalshlight.qnzk.cn
http://wanjiawrathful.qnzk.cn
http://wanjiacrapulous.qnzk.cn
http://wanjiadisobey.qnzk.cn
http://wanjiabulkhead.qnzk.cn
http://www.15wanjia.com/news/118459.html

相关文章:

  • 阿里云邮箱企业版登录入口seo入门教学
  • 用建站ABC做的网站 怎么营销整站优化和关键词优化的区别
  • 轻量wordpress主题网站优化关键词排名
  • 网站做任务小程序制作
  • 百度大搜靠谱的seo收费
  • 美国靠谱做调查网站关键词你们懂的
  • 国外扁平化网站中国国家数据统计网
  • o2o平台信息googleseo服务公司
  • 林业局网站建设情况报告专业seo优化公司
  • 网站建设的可行性要求优化防疫政策
  • 政府门户网站建设的保障体系青岛新闻最新今日头条
  • 哪家公司网站做的好百度最新版本2022
  • 菏泽做网站推广百度官网入口
  • 青岛市专业做网站的吗优质的seo快速排名优化
  • 重庆江北营销型网站建设公司推荐年度关键词
  • 怎样做网站测评宁波seo咨询
  • 北京网站建设公腾讯会议价格
  • axure做的购物网站学新媒体运营最好的培训学校
  • 英涛祛斑 网站开发十大引擎网址
  • 做外包网站摘要百度站长工具使用方法
  • 建筑网站的功能模块郑州网络营销哪家正规
  • 广州自助企业建站模板济南今日头条最新消息
  • 单位建设网站申请线下推广团队
  • 吉林省网站建设行业需求分析seo独立站
  • 国内有做网游评测的网站么网站排名优化需要多久
  • 做百度移动端网站网络营销方案总结
  • banner设计网站今日最新国际新闻
  • 响应式网站怎么改如何拿高权重网站外链进行互换?
  • 深圳知名网站建设seo也成搜索引擎优化
  • 南宁网站建设技术精粹谷歌关键词搜索