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元,工作已经一年了,也适应了工作的压力和节奏,很感谢疯狂软件教育老师们的教导。 

原文地址:https://www.cnblogs.com/gojava/p/3696561.html