线程封闭
数据被封闭在各自的线程之中被线程私有,不需要进行同步,这种通过数据封闭在线程中而避免使用同步的技术成为线程封闭。
它具体的体现有:ThreadLocal、局部变量(也叫做栈封闭,它是线程所固有的特点,局部变量位于该线程执行的虚拟机栈中)
示例代码:
/**
*
* ThreadLocal为每个线程都创建一个副本,每个线程可以访问自己内部的副本变量。
* 那ThreadLocal有什么作用呢?如果只是单纯的想要线程隔离,在每个线程中声明一个私有变量就好了呀,为什么要使用ThreadLocal?
*
* 如果开发者希望将类的某个静态变量(user ID或者transaction ID)与线程状态关联,则可以考虑使用ThreadLocal。
* 最常见的ThreadLocal使用场景为用来解决数据库连接、Session管理等。
* 数据库连接和Session管理涉及多个复杂对象的初始化和关闭。
* 如果在每个线程中声明一些私有变量来进行操作,那这个线程就变得不那么“轻量”了,需要频繁的创建和关闭连接。
*/
public class ThreadLocalDemo {
static class ThreadA implements Runnable{
ThreadLocal<String> threadLocalStr;
public ThreadA(ThreadLocal<String> threadLocalStr) {
this.threadLocalStr = threadLocalStr;
}
@Override
public void run() {
threadLocalStr.set("threadA");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程为:" + Thread.currentThread().getName() +",threadlocal值为:" +threadLocalStr.get());
}
}
static class ThreadB implements Runnable{
ThreadLocal<String> threadLocalStr;
public ThreadB(ThreadLocal<String> threadLocalStr) {
this.threadLocalStr = threadLocalStr;
}
@Override
public void run() {
threadLocalStr.set("threadB");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("当前线程为:" + Thread.currentThread().getName() + ",threadlocal值为:" +threadLocalStr.get());
}
}
public static void main(String[] args) {
ThreadLocal<String> threadLocal = new ThreadLocal<>();
threadLocal.set("test");
new Thread(new ThreadA(threadLocal)).start();
new Thread(new ThreadB(threadLocal)).start();
}
}