概念:
数据封闭在各自的香橙中,不需要进行数据的同步,这种通过将数据封闭在各自的线程中,避免使用数据同步技术即线程封闭。
线程封闭有两种方式:
1、ThreadLocal
线程级别的变量,每个线程都有自己独立的ThreadLocal的变量,在并发模式下是绝对线程安全的。
ThreadLocal会在每个线程上创建一个副本,副本之间是彼此独立、互不影响的;可以使用ThreadLocal存放参数,方便在线程的多个方法中使用,用来代替方法传参。
public static ThreadLocal<String> threadlocal = new ThreadLocal<>();
public void threadLocalTest() throws Exception {
threadlocal.set("123");
String v = threadlocal.get();
System.out.println(v);
new Thread(new Runnable() {
@Override
public void run() {
String v = threadlocal.get();
System.out.println("线程取到的值:" + v);
// 设置 threadLocal
threadlocal.set("456");
v = threadlocal.get();
System.out.println("重新设置后,线程取到的值:" + v);
System.out.println("线程执行结束");
}
}).start();
Thread.sleep(5000L);
v = threadlocal.get();
System.out.println("线程执行后,主线程取到的值:" + v);
}
public static void main(String[] args) throws Exception {
new Demo().threadLocalTest();
}
栈封闭(局部变量):
虚拟机栈:每个线程在虚拟机栈中都有一个私有的空间,称为线程栈,而线程栈由多个栈帧(Stack Frame)组成。一个线程需要执行一个或多个方法,一个方法对应一个栈帧。栈帧包括局部变量表、操作数栈、动态链接、方法返回地址、附件信息等。虚拟机栈内存默认最大是1M,超过就会抛出StackOverflowError(栈溢出)。
局部变量存放在栈帧中的局部变量表中,而每一个栈对应一个线程。