线程封闭
多线程访问共享可变数据时,涉及到线程间数据同步的问题。并不是所有时候,都要用到共享数据,所以线程封闭的概念就提出来了。
数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。
线程封闭的具体体现:ThreadLocal和局部变量
- ThreadLocal是Java里一种特殊的变量
它是一个线程级别的变量,每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,在并发模式下是绝对安全的变量。
用法:ThreadLocal<T> var=new ThreadLocal<T>();
会自动在每一个线程上创建一个T的副本,副本之间彼此独立,互不影响。
可以用ThreadLocal存储一些参数,以便在线程中多个方法中使用,用来代替方法传参的做法。
可以理解为,JVM维护一个Map<Thread,T>,每个线程要用这个T的时候,用当前的线程去Map里面取
public class ThreadLocalTest {
private static final ThreadLocal<Integer> LOCAL = new ThreadLocal(){
// 覆盖初始化方法
@Override
public Integer initialValue() {
return 0;
}
};
// 下一个序列号
public int getNextNum() {
LOCAL.set(LOCAL.get() + 1);
return LOCAL.get();
}
private static class TestClient extends Thread {
private ThreadLocalTest sn;
public TestClient(ThreadLocalTest sn) {
this.sn = sn;
}
// 线程变量加加
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(Thread.currentThread().getName() +" Num:" + sn.getNextNum());
}
}
}
public static void main(String[] args) {
ThreadLocalTest test = new ThreadLocalTest();
new TestClient(test).start();
new TestClient(test).start();
new TestClient(test).start();
}
}
- 栈封闭
局部变量的固有属性之一就是封闭在线程中,它们位于执行线程的栈中,其他线程无法访问这个栈。
网友评论