ThreadLocal

ThreadLocal的特点

1. ThreadLocal 可以实现【资源对象】的线程隔离,让每个线程各用各的【资源对象】,避免引用引起的线程安全问题

2. ThreadLocal 同时实现线程内资源共享(一个线程里面)

ThreadLocal的特原理:

(1)调用set方法,就是以 ThreadLocal 自己作为key,资源对象作为 value,放入当前线程的 ThreadLocalMap 集合中

(2)调用get方法,就是以 ThreadLocal自己作为key,到当前线程中查找关联的资源值

(3)调用 remove方法,就是以 ThreadLocal自己作为key,移除当前线程关联的资源值

为什么 ThreadLocal中的key(即 ThreadLocal)要设计为弱引用?

(1)Thread可能需要长时间运行(如线程池中的线程),如果key不在使用,需要再内存不足(GC)时释放其占用的内存

 ()但GC是让key的内存释放,后续还要根据key是否为null来进一步释放值的内存,其释放的时机有:        

        1)获取key发现 null key

        2) set key时,会使用启发式扫描,清除临近的 null key,启发次数与元素个数,受否发现 null key 有关

        3) remove时(土建使用);一般 ThreadLocal都作为静态变量,因此GC无法回收

ThreadLocal的特点代码示例:

package com.irving.list;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author zdq
 * @version 1.0
 * @date 2022/5/16 15:42
 * @describe
 */
public class ThreadLocalStudy {
    public static void main(String[] args) throws InterruptedException {
        test1();  // 多线程下,实现【资源对象】的线程隔离
        test2();  // 一个线程,实现线程内资源共享

    }
    // 单个线程
    public static void test2(){
        for (int i = 0; i <2 ; i++) {
            new Thread(()->{
                    System.out.println(utils.getConnection());
                    System.out.println(utils.getConnection());},"t").start();
        }
    }
    // 多个线程
    public static void test1(){
        for (int i = 0; i <5 ; i++) {
            new Thread(()->System.out.println(utils.getConnection()),"t"+(i+1)).start();
        }
    }
  static class utils{
        private static final ThreadLocal<Connection> t1=new ThreadLocal<>();
        public static Connection getConnection(){
            Connection connection = t1.get();  // 当前线程获取资源
            if(connection==null){
                connection = getCon();         //
                t1.set(connection);             //将资源存入当前线程
            }
            return connection;
        }
  }
    private static Connection getCon(){
        try {
            return DriverManager.getConnection("jdbc:mysql://localhost:3306/imapi?useSSL=false","root","root");
        }catch (SQLException e){
            throw new RuntimeException();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值