当前位置:K88软件开发文章中心编程语言JavaJava01 → 文章内容

JAVA并发编程7_线程封闭:ThreadLocal类

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-4 7:54:15

-->

多线程访问共享数据时,通常需要同步,一种避免使用同步的方式就是不共享数据。如果仅在单线程里访问数据,那么就不需要使用同步,这种技术被称为线程封闭。

Ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。

栈封闭:我的理解就是局部变量,局部变量是线程私有的,不会被共享,也就不存在竞争问题。因此能使用局部变量的地方就不要使用全局变量。
ThreadLocal类:一种维护线程封闭性更规范的方法。顾名思义就是创建一个线程局部变量。它会为使用相同变量的每个不同线程都创建不同存储。我的理解是在使用全局的变量(多线程均可能同时访问的变量)的前提下,多个线程同时去访问该变量,一般会出现线程不安全,而此时我们又不需要共享该变量,就可以使用ThreadLocal类来解决。

实际上,ThreadLocal根本就不是解决共享变量的问题,线程之间根本就不会共享变量,一定要注意ThreadLocal是用来隔离线程存储数据的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Test implements Runnable{  
    private ThreadLocal<Integer> num = new ThreadLocal<Integer>(){  
        protected Integer initialValue() {  
            return 100;  
        };  
    };  
     
    @Override  
    public void run() {  
        while (!Thread.currentThread().isInterrupted()) {  
            increment();  
            System.out.println(Thread.currentThread().getName() + "  " + num.get());  
            Thread.yield();  
        }  
    }  
     
    private void increment() {  
        num.set(num.get() + 1);  
    }  
 
    public static void main(String[] args) throws InterruptedException {  
        Test test = new Test();  
        ExecutorService exec = Executors.newCachedThreadPool();  
        for (int i = 0; i < 5; i++) {  
            exec.execute(test);  
        }  
        TimeUnit.MILLISECONDS.sleep(5);  
        exec.shutdownNow();  
    }  
}

输出

pool-1-thread-2  101  pool-1-thread-1  101  pool-1-thread-4  101  pool-1-thread-3  101  pool-1-thread-5  101  pool-1-thread-4  102  pool-1-thread-1  102  pool-1-thread-3  102  pool-1-thread-2  102  pool-1-thread-5  102  pool-1-thread-1  103  pool-1-thread-4  103  pool-1-thread-3  103  pool-1-thread-2  103  pool-1-thread-5  103  pool-1-thread-1  104  pool-1-thread-4  104  pool-1-thread-3  104  pool-1-thread-2  104  pool-1-thread-5  104  …  

程序运行时,很显然每个线程都被分配了自己的存储。如果不是使用ThreadLocal类,那这五个线程共享的是num变量,必然会产生线程不安全产生竞争。


JAVA并发编程7_线程封闭:ThreadLocal类