Spring @Transaction注解实现的事务,也是通过TL来在同一线程间不同方法共享Connection
1. ThreadLocal是什么?
当某些数据是以线程为作用域并且不同线程有不同数据副本时,考虑ThreadLocal。
一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。
2. ThreadLocal的简单使用
public class ThreadLocaDemo {
private static ThreadLocal<String> localVar = new ThreadLocal<String>();
static void print(String str) {
//打印当前线程中本地内存中本地变量的值
System.out.println(str + " :" + localVar.get());
//清除本地内存中的本地变量
localVar.remove();
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
public void run() {
ThreadLocaDemo.localVar.set("local_A");
print("A");
//打印本地变量
System.out.println("after remove : " + localVar.get());
}
},"A").start();
Thread.sleep(1000);
new Thread(new Runnable() {
public void run() {
ThreadLocaDemo.localVar.set("local_B");
print("B");
System.out.println("after remove : " + localVar.get());
}
},"B").start();
}
}
A :local_A
after remove : null
B :local_B
after remove : null
两个线程分表获取了自己线程存放的变量,他们之间变量的获取并不会错乱
3. ThreadLocal的实现原理
Set
其中每一个线程都有一个ThreadLocals,指向ThreadLocalMap(Map)
Get
public T get() { //1、获取当前线程 Thread t = Thread.currentThread(); //2、获取当前线程的ThreadLocalMap ThreadLocalMap map = getMap(t); //3、如果map数据为空, if (map != null) { //3.1、获取threalLocalMap中存储的值 ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } //如果是数据为null,则初始化,初始化的结果,TheralLocalMap中存放key值为threadLocal,值为null return setInitialValue(); } private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
remove


其中每一个线程都有一个ThreadLocals,指向ThreadLocalMap(Map)



3313

被折叠的 条评论
为什么被折叠?



