public class ThreadLocalTrxt {
static ThreadLocal<Object> x1 = new ThreadLocal<Object>();
static ThreadLocal<Object> x2 = new ThreadLocal<Object>();
static ThreadLocal<Object> x3 = new ThreadLocal<Object>();
static ThreadLocal<Object> x4 = new ThreadLocal<Object>();
static ThreadLocal<Object> x5 = new ThreadLocal<Object>(); public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i<5; i++) {
x1.set(i); //把x1设置到这个线程的threadLocals里面的table里面的Entry里面的referent里面去,还有i=0
x2.set(i);
x3.set(i);
x4.set(i);
x5.set(i);
}
Thread t = Thread.currentThread();
ThreadLocal<Object> x6 = new ThreadLocal<Object>();
x6.remove();
x1.remove();
x2.remove();
x3.remove();
x4.remove();
x5.remove();
}
}).start();
}
}
}
public class Test {

    public static void main(String[] args) {
AtomicInteger hashCode = new AtomicInteger();
int hash_increment = 0x61c88647;
int size = 32;
List <Integer> list = new ArrayList <> ();
for (int i = 0; i < size; i++) {
System.out.println(hashCode);
hashCode.getAndAdd(hash_increment);
System.out.println(hashCode);
System.out.println(hashCode.intValue() & (size - 1));
list.add(hashCode.intValue() & (size - 1));
}
System.out.println("original:" + list);
Collections.sort(list);
System.out.println("sort: " + list);
System.out.println(hash_increment);
}
}
public class ThreadLocalTrxt {
static ThreadLocal<Integer> x = new ThreadLocal<Integer>();
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int s = new Random().nextInt();
x.set(s); // ThreadLocal 设置值的时候,自动跟线程关联
System.out.println(x.get()); // ThreadLocal 取值的时候,自动跟线程关联
}
}).start();
}
}
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t); // 返回null
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
threadLocals是ThreadLocalMap在线程Thread里面
ThreadLocalMap getMap(Thread t) {
return t.threadLocals; // 返回线程的threadLocals,是一个ThreadLocalMap类型,只不过这个类型在ThreadLocal里面定义
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue); //this是ThreadLocal,调用x.set(s);的x
} public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}

 ThreadLocal设置值是设置到这个线程的threadLocals属性里面去了,并且ThreadLocal自己也在threadLocals里面。多个线程共用这个ThreadLocal

ThreadLocalMap的key是ThreadLocal,Value是set方法设置进来的值。
Entry是ThreadLocalMap的内部类,ThreadLocal和value2个属性组成。

线程初始化时候:

public class ThreadLocalTrxt {
static ThreadLocal<Object> x1 = new ThreadLocal<Object>();
static ThreadLocal<Object> x2 = new ThreadLocal<Object>();
static ThreadLocal<Object> x3 = new ThreadLocal<Object>();
static ThreadLocal<Object> x4 = new ThreadLocal<Object>();
static ThreadLocal<Object> x5 = new ThreadLocal<Object>();
static ThreadLocal<Object> x6 = new ThreadLocal<Object>(); public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {//2个线程调用,则2个线程共享x1,x2,x3,x4,x5,x6。但是ThreadLocal里面没有属性(只是充当一个key),2个线程修改的时候,
//修改的是线程内部的threadLocals。Thread和ThreadLocal是在一个包下的。不同线程相同的key(ThreadLocal)得到的可以是不同的value。
@Override
public void run() {
for(int i = 0; i<5; i++) {
x1.set(i); //把x1设置到这个线程的threadLocals里面的table里面的Entry里面的referent里面去,还有i=0
x2.set(i); // 重复调用会覆盖
x3.set(i);
x4.set(i);
x5.set(i);
x6.set(i);
}
Thread t = Thread.currentThread();
System.out.println(x1.get());
x1.remove();
}
}).start();
}
}
}

ThreadLocal无法解决线程安全问题。也就是说ThreadLocal是被各个线程共享的。

ThreadLocal源代码1的更多相关文章

  1. Java ThreadLocal 源代码分析

    Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...

  2. 多线程之美2一ThreadLocal源代码分析

    目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3. ...

  3. ThreadLocal源代码3

    public class ThreadLocal1<T> { //当创建了一个 ThreadLocal 的实例后,它的散列值就已经确定了, //threadLocal实例的hashCode ...

  4. ThreadLocal源代码2

    private static int nextIndex(int i, int len) { return ((i + 1 < len) ? i + 1 : 0); } private stat ...

  5. 另一鲜为人知的单例写法-ThreadLocal

    另一鲜为人知的单例写法-ThreadLocal 源代码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们寻经常使用双重检查锁非常不一样.而是用来一个T ...

  6. java ThreadLocal(应用场景及使用方式及原理)

    尽管ThreadLocal与并发问题相关,可是很多程序猿只将它作为一种用于"方便传參"的工具,胖哥觉得这或许并非ThreadLocal设计的目的,它本身是为线程安全和某些特定场景的 ...

  7. ThreadLocal分析

    我们再介绍一个在多线程环境中经常使用的类ThreadLocal,它是java为解决多线程程序的并发问题提供了一种新的方向,使用这个ThreadLocal类可以帮助开发者很简单地编写出简洁的程序,并且是 ...

  8. ThreadLocal深入理解与内存泄露分析

    ThreadLocal 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本.所以每个线程都能够独立地改变自己的副本.而不会影响其他线程所相应的副本. ...

  9. 深入理解线程本地变量ThreadLocal

    ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...

随机推荐

  1. 24 Home Assistant

    Home Assistant https://github.com/home-assistant/home-assistant python3 -m pip install homeassistant ...

  2. js json 排序

    /* json:需要排序的json key:排序项 */ function JsonSort(json, key) { //console.log(json); for (var j = 1, jl ...

  3. MongoDB Shell db.runCommand

    db.runCommand()示例 我们使用MongoDB Shell登录到mongos,添加Shard节点 [root@100 shard]# /usr/local/mongoDB/bin/mong ...

  4. 使用blessed-contrib 开发专业的终端dashboard

    blessed-contrib 是blessed 的一个扩展包,以前有说过blessed(一个方便的开发cli 的工具) 我们使用blessed-contrib可以开发专业的终端dashboard 功 ...

  5. 常用方法 Entitys转换为DataTable

    效率比较屁,将近可以用 public static DataTable EntitiesToDataTable<T>(List<T> entitys) { Type t = t ...

  6. 统计学基础知识(二)---推断统计学(Inferential Statistics)

    推断统计学(Inferential Statistics):利用样本信息对总体进行估计和假设检验. 总体(population):在一个特定研究中所有感兴趣的个体组成的集合. 样本(sample):总 ...

  7. SpringBoot:使用Jenkins自动部署SpringBoot项目(二)具体配置

    1.启动Jenkins 在浏览器输入ip:port后,进入Jenkins初始化界面,需要查看文件,得到密码. 输入密码进入初始化界面,选择推荐插件安装. 安装完成创建账号,进入Jenkins主界面. ...

  8. 记一次 HttpClient 死锁问题

    原文:http://blog.kail.xyz/post/2019-04-21/tools/httpclient-lock.html 最近遇到一个使用 Apache HttpClient 过程中的问题 ...

  9. Mstar 平台(648)唤醒之串口唤醒

    串口唤醒功能主要是从supernova 待机进入PM后,串口接收PC端口发送过来的特定字串,然后将主板唤醒的功能.与IR,KEYPAD,WOL,CEC,MHL 等等基本流程一致,触发源不一样而已. 待 ...

  10. Pushing state-of-the-art in 3D content understanding

    Pushing state-of-the-art in 3D content understanding 2019-10-31 06:34:08 This blog is copied from: h ...