• Java 多线程基础知识之线程封闭


      广州疯狂软件教育Java培训,iOS培训分享

      1.定义

      当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式是不共享数据。如果仅在单线程里访问数据,那么就不需要使用同步,这种技术被称为线程封闭。

      2.分类 2.1 栈封闭

      栈封闭是线程封闭的一种特例,在栈封闭中,只能通过局部变量才能访问对象。

      2.2 ThreadLocal类

      维护线程封闭性的一种更常规方法是使用ThreadLocal,这个类能使线程中的某个值与保存值的对象关联起来。

      ThreadLocal对象通过用于防止对可变的单实例变量或者全局变量进行共享。

      Thread类中定义了一个ThreadLocal.ThreadLocalMap变量:

      ThreadLocal.ThreadLocalMap threadLocals = null;

      从ThreadLocal的源码中可以分析出,ThreadLocal包含了一个嵌套类ThreadLocalMap,ThreadLocalMap中包含了一个嵌套类Entry,ThreadLocalMap是存放线程局部变量的数据结构,他是和线程绑定在一起的,存放在ThreadLocal中的变量是和ThreadLocal相关联的。这可以从get()方法中看出:

      public T get() {

      Thread t = Thread.currentThread();

      ThreadLocalMap map = getMap(t);

      if (map != null) {

      ThreadLocalMap.Entry e = map.getEntry(this);

      if (e != null)

      return (T)e.value;

      }

      return setInitialValue();

      }

      ThreadLocalMap getMap(Thread t) {

      return t.threadLocals;

      }

      private Entry getEntry(ThreadLocal key) {

      int i = key.threadLocalHashCode & (table.length - 1);

      Entry e = table[i];

      if (e != null && e.get() == key)

      return e;

      else

      return getEntryAfterMiss(key, i, e);

      }

      private Entry getEntryAfterMiss(ThreadLocal key, int i, Entry e) {

      Entry[] tab = table;

      int len = tab.length;

      while (e != null) {

      ThreadLocal k = e.get();

      if (k == key)

      return e;

      if (k == null)

      expungeStaleEntry(i);

      else

      i = nextIndex(i, len);

      e = tab[i];

      }

      return null;

      }

      广州疯狂软件教育培训机构怎么样?不妨听听疯狂软件毕业学员感言:

      在疯狂软件学习的过程中,虽然学习比较辛苦,但是很充实,老师讲解得非常详细,也讲解了很透彻,让我更加肯定了自己的发展方向,在学习的过程中最重要的是自己多敲多写代码,才能让自己理解得更加深刻,从而达到知识的巩固和吸收。在工作中,学习是一件很奢侈的事情,在工作期间,工作机会通常会安排得满满的,这样会让自己没有时间进行系统而有效的学习,这就要在培训的时候付出更多的努力学习知识,以便丰富自己的技能知识,当时,在快要就业的时候,拿到了2家公司offer,入职广州市绿番茄软件科技有限公司,岗位:Java开发工程师,薪资5500元,工作已经一年了,也适应了工作的压力和节奏,很感谢疯狂软件教育老师们的教导。 

  • 相关阅读:
    【java】关于泛型修饰符
    【java】使用lambda和函数接口Comparator
    【js】简单模拟JQuery原理
    【js】事件捕获与冒泡 (这可能是这个知识点 字最少,且讲的最清楚的教程)
    【js】实现 鼠标按下并未松开 事件
    【js】多维排序
    【JS】 初识JS原型
    【MyBatis】逆向工程
    【Struts】struts的DevMode模式
    Linux下gcc相关
  • 原文地址:https://www.cnblogs.com/gojava/p/3696561.html
Copyright © 2020-2023  润新知