学习Java中常用的开源框架,Mybatis、Hibernate中设计到线程通过数据库连接对象Connection,对其数据进行操作,都会使用ThreadLocal类来保证Java多线程程序访问和数据库数据的一致性问题。就想深入了解一下ThreadLocal类是怎样确保线程安全的!详解如下:
ThreadLocal的简单使用:
public class Test01 {
ThreadLocal<Long> longLocal=new ThreadLocal<>();
ThreadLocal<String> stringLocal=new ThreadLocal<>();
public void set(){
longLocal.set(Thread.currentThread().getId());
stringLocal.set(Thread.currentThread().getName());
}
public long getLong(){
return longLocal.get();
}
public String getString(){
return stringLocal.get();
}
public static void main(String[] args) throws InterruptedException {
new Thread().start();
Test01 t=new Test01();
t.set();
System.gc();
Thread.sleep(100);
System.out.println(t.getLong());
System.out.println(t.getString());
Thread thread1 = new Thread(()->{
t.set();
System.out.println("\n子线程 Thread-0 :");
System.gc();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(t.getLong());
System.out.println(t.getString());
});
thread1.start();
}
}
//输出结果
//1
//main
//
//子线程 Thread-0 :
//12
//Thread-1
ThreadLocal主要为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。一个线程可以储存多个ThreadLocal的值,具体看上面的例子。