import java.lang.ThreadLocal.ThreadLocalMap;
import java.lang.ThreadLocal.ThreadLocalMap.Entry;
import java.util.HashMap;
public class ThreadLocalTest2 {
public ThreadLocalTest2() {
super();
}
/**
* @param args
*/
public static void main(String[] args) {
ThreadLocal<String> t_get = Threadlocal1();
ThreadLocal<String> tl2 = new ThreadLocal<String>();
/*
* ThreadLocal是用自己的object作为map的key
*/
System.out.println(tl2.get()); // null
System.out.println(t_get.get());// defg
// =======================================
for (int i = 0; i < 3; i++) {
new Thread() {
public void run() {
ThreadLocalManager.init();
try {
/*
* 保证3个线程init都执行完毕,在打出内容,发现hashMap中内容一致(被覆盖了!)
*/
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ThreadLocalManager.threadLocal1.get());
System.out.println(ThreadLocalManager.threadLocal2.get());
System.out.println(ThreadLocalManager.hm.get("key"));
System.out.println("============");
}
}.start();
}
}
public static ThreadLocal<String> Threadlocal1() {
ThreadLocal<String> tl1 = new ThreadLocal<String>();
tl1.set("abc");
ThreadLocal<String> tl2 = new ThreadLocal<String>();
tl2.set("defg");
return tl2;
}
}
class ThreadLocalManager {
public static int i = 0;
public static ThreadLocal<Integer> threadLocal1 = new ThreadLocal<Integer>();
public static ThreadLocal<Integer> threadLocal2 = new ThreadLocal<Integer>();
public static HashMap hm = new HashMap();
public static void init() {
threadLocal1.set(Thread.currentThread().hashCode());
/*
* i++,相当于new Integer(i++);
* 也就是说对象已经变了,每次传过去的堆上的Integer已经变了
* 变的是引用变量的指向(static i)
* 在线程内部调用了这个init()方法,相当于在每个线程都new Integer()
*/
threadLocal2.set(i++);
/*
* 这个key在hash以后在每个线程都是一样的
* threadLocal中的map的key是线程 ,每个线程不同的
*/
hm.put("key", i++);
}
}
/*getMap & createMap都是根据t : 当前 Thread作为参数,也就是说对于不同线程来说,这个ThreadLocalMap 是不同的
static class ThreadLocalMap 是一个内部类,类似map,有一个Entry[] table构成,但是没有实现Map接口*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
/*
* createMap的时候,都是new一个对象ThreadLocalMap,然后把这个对象给t.threadLocals,t是当前线程(参看set方法)
* 因为是new 的对象,所以显然证明这个ThreadLocalMap对于每一个Thread是不同的.
*/
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
/*
* ThreadLocalMap的构造函数传的是this - 也就是ThreadLocal对象.
* hash以后,用threadlocal作为key存放我们的value, Entry 数组是典型的map实现
*/
ThreadLocalMap(ThreadLocal firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
/*
* get方法,注意的是 if (null = map) setInitialValue
* 也就是说这个ThreadLocalMap不是我们new ThreadLocal就有个,而是调用get(),set()方法的时候才会建立的
* setInitialValue 返回 null !
*/
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();
}
分享到:
相关推荐
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
这个压缩包 "Quartz-ThreadLocal.rar" 内含的学习资源很可能是关于如何在 Quartz 调度器中结合使用 ThreadLocal 的示例。 Quartz 的核心功能包括: 1. **作业与触发器**:在 Quartz 中,任务被称为“作业”(Job)...
1. 多线程:理解ThreadLocal的使用必须建立在对多线程的理解基础上,包括线程的创建、执行、同步机制等。 2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3....
Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...
1. 创建ThreadLocal实例,声明变量类型。 2. 在需要的地方,通过set方法设置线程局部变量的值。 3. 在合适的时候,通过get方法获取当前线程的变量副本。 4. 不再使用时,调用remove方法清除线程局部变量,防止内存...
通过深入源码学习,我们可以更好地理解Spring如何在多线程环境中优雅地管理事务,以及如何利用ThreadLocal来优化并发性能。同时,了解数据库连接池的工作原理也有助于我们更好地配置和使用连接池,提升应用程序的...
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中一个非常重要的工具类,它主要用于在多线程环境中提供线程局部变量。...学习并理解ThreadLocal的原理和使用方法对于编写高效、安全的多线程Java程序至关重要。
1. **ThreadLocal类的使用**:ThreadLocal提供了一个`set(T value)`方法用于设置当前线程的ThreadLocal变量值,`get()`方法用于获取当前线程的变量值。此外,`remove()`方法用来移除当前线程的ThreadLocal变量,防止...
1. **ThreadLocal的创建与使用**:在Java中,我们可以通过创建ThreadLocal的实例并调用其`set()`方法来设置线程局部变量,通过`get()`方法获取该变量。ThreadLocal对象本身是全局的,但存储的值是线程局部的。 2. *...
1. **线程内的数据共享与对象独立**: 在例子中,使用了HashMap来存储每个线程的数据,通过Thread.currentThread()作为键来存取数据。这样每个线程都有自己的数据副本,实现了线程内的数据独立,避免了线程之间的...
1. **Hibernate配置**:文件可能包含了配置SessionFactory的代码,如定义配置文件路径、数据库连接参数等。 2. **SessionFactory的创建**:SessionFactory是Hibernate的核心,它是线程安全的,负责管理数据库的连接...
Java单线程ThreadLocal串值问题解决方案主要介绍了Java单线程ThreadLocal串值问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 ThreadLocal简介 ThreadLocal是Java中...
ThreadLocal是Java编程中一个非常重要的工具类,它允许我们在多线程环境下为每个线程创建独立的变量副本。在每个线程内部,ThreadLocal变量就像一个私有的局部变量,不同线程之间的副本互不干扰,确保了数据的安全性...
1. **减少参数传递**:当一个对象需要在多个方法或者多个线程之间共享,但又不想通过参数传递时,可以使用ThreadLocal。例如,在上述描述中,`Parameter` 类的静态`ThreadLocal` 实例允许模块A初始化后,模块B和模块...
主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
ThreadLocal 2 Enum 3 Throwable 3 Error 3 Exception 3 Class 4 ClassLoader 4 Compiler 4 System 4 Package 4 Void 4 java.util AbstractList 1 AbstractMap 1 AbstractSet 1 ArrayList 1 LinkedList 1 HashMap 1 ...
【JavaGuideInterview学习】是一个专为Java开发者设计的考试类精品资源,旨在通过每日的“3+1”学习模式,即三个技术问题加一个思维挑战,来推动学习者深入理解和掌握Java相关的编程知识和面试技巧。这个压缩包包含...
1. 集合框架:深入学习List、Set、Map接口及其实现类,理解它们的区别和应用场景。 2. 多线程:掌握并发编程,理解线程状态,熟悉synchronized、volatile、ThreadLocal等关键字。 3. 文件与I/O流:学习文件操作,...