深入理解ThreadLocal的原理及内存泄漏问题

        学习Java中常用的开源框架,Mybatis、Hibernate中设计到线程通过数据库连接对象Connection,对其数据进行操作,都会使用ThreadLocal类来保证Java多线程程序访问和数据库数据的一致性问题。就想深入了解一下ThreadLocal类是怎样确保线程安全的!详解如下:

        ThreadLocal的简单使用:

public class Test01 {
    ThreadLocal<Long> longLocal=new ThreadLocal<>();
    ThreadLocal<String> stringLocal=new ThreadLocal<>();

    public void set(){
        longLocal.set(Thread.currentThread().getId());
        stringLocal.set(Thread.currentThread().getName());
    }

    public long getLong(){
        return longLocal.get();
    }

    public String getString(){
        return stringLocal.get();
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread().start();
        Test01 t=new Test01();
        t.set();
        System.gc();
        Thread.sleep(100);
        System.out.println(t.getLong());
        System.out.println(t.getString());


        Thread thread1 = new Thread(()->{
            t.set();
            System.out.println("\n子线程 Thread-0 :");

            System.gc();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(t.getLong());
            System.out.println(t.getString());
        });
        thread1.start();
    }
}
//输出结果
//1
//main
//
//子线程 Thread-0 :
//12
//Thread-1

   ThreadLocal主要为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。一个线程可以储存多个ThreadLocal的值,具体看上面的例子。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值