首页 > 编程语言 > 详细

线程封闭threadlocal和栈封闭

时间:2020-02-29 22:31:16      阅读:83      评论:0      收藏:0      [点我收藏+]

ThreadLocal是java里面的特殊变量

他是一个线程级别的变量,每个线程都有一个threadlocal就是每个线程都有自己的独立的一个变量

竞争状态下被彻底消除了,在并发模式下是绝对安全的变量

 

用法:Thread Local<T> var =new THreadLocal<T>();

会自动在那个线程中创建一个T的副本副本之间彼此独立不会影响

可以使用ThreadLocal存储一些参数,一边线程中多个方法使用,用来替代方法传参的做法

 

实现原理,jvm维护了一个map<Thread ,T> 每个线程去Map里面去,

看代码案例:

/** 线程封闭示例 */
public class Demo7 {
    /** threadLocal变量,每个线程都有一个副本,互不干扰 */
    public static ThreadLocal<String> value = new ThreadLocal<>();

    /**
     * threadlocal测试
     * 
     * @throws Exception
     */
    public void threadLocalTest() throws Exception {

        // threadlocal线程封闭示例
        value.set("这是主线程设置的123"); // 主线程设置值
        String v = value.get();
        System.out.println("线程1执行之前,主线程取到的值:" + v);

        new Thread(new Runnable() {
            @Override
            public void run() {
                String v = value.get();
                System.out.println("线程1取到的值:" + v);
                // 设置 threadLocal
                value.set("这是线程1设置的456");

                v = value.get();
                System.out.println("重新设置之后,线程1取到的值:" + v);
                System.out.println("线程1执行结束");
            }
        }).start();

        Thread.sleep(5000L); // 等待所有线程执行结束

        v = value.get();
        System.out.println("线程1执行之后,主线程取到的值:" + v);

    }

    public static void main(String[] args) throws Exception {
        new Demo7().threadLocalTest();
    }
}

栈封闭:  局部变量 

局部变量就是线程封闭中,其他线程无法访问

线程封闭threadlocal和栈封闭

原文:https://www.cnblogs.com/cxyxiaobao/p/12386293.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!