Java之ThreadLocal使用常见和方式案例讲解
admin
2023-05-01 07:11:55
目录

    【面试高频】- ThreadLocal的使用场景以及使用方式是怎么样的

    1 两大使用场景-ThreadLocal的用途

    2 典型场景1:每个线程需要一个独享的对象

    每个Thread内有自己的实例副本,不共享;

    举例:SimpleDateFormat。(当多个线程共用这样一个SimpleDateFormat,但是这个类是不安全的)

    package threadlocal;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * 描述:     利用ThreadLocal,给每个线程分配自己的dateFormat对象,保证了线程安全,高效利用内存
     */
    public class ThreadLocalNormalUsage05 {
    
        public static ExecutorService threadPool = Executors.newFixedThreadPool(10);
    
        public static void main(String[] args) throws InterruptedException {
            for (int i = 0; i < 1000; i++) {
                int finalI = i;
                threadPool.submit(new Runnable() {
                    @Override
                    public void run() {
                        String date = new ThreadLocalNormalUsage05().date(finalI);
                        System.out.println(date);
                    }
                });
            }
            threadPool.shutdown();
        }
    
        public String date(int seconds) {
            //参数的单位是毫秒,从1970.1.1 00:00:00 GMT计时
            Date date = new Date(1000 * seconds);
    //        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat dateFormat = ThreadSafeFormatter.dateFormatThreadLocal2.get();
            return dateFormat.format(date);
        }
    }
    
    class ThreadSafeFormatter {
    
        public static ThreadLocal dateFormatThreadLocal = new ThreadLocal() {
            @Override
            protected SimpleDateFormat initialValue() {
                return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }
        };
    
        public static ThreadLocal dateFormatThreadLocal2 = ThreadLocal
                .withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    }

    3 典型场景2:当前用户信息需要被线程内所有方法共享

    每个线程内需要保存全局变量,可以让不同方法直接使用,避免参数传递的麻烦

    package threadlocal;
    
    /**
     * 描述:     演示ThreadLocal用法2:避免传递参数的麻烦
     */
    public class ThreadLocalNormalUsage06 {
    
        public static void main(String[] args) {
            new Service1().process("");
    
        }
    }
    
    class Service1 {
    
        public void process(String name) {
            User user = new User("超哥");
            UserContextHolder.holder.set(user);
            new Service2().process();
        }
    }
    
    class Service2 {
    
        public void process() {
            User user = UserContextHolder.holder.get();
            ThreadSafeFormatter.dateFormatThreadLocal.get();
            System.out.println("Service2拿到用户名:" + user.name);
            new Service3().process();
        }
    }
    
    class Service3 {
    
        public void process() {
            User user = UserContextHolder.holder.get();
            System.out.println("Service3拿到用户名:" + user.name);
            UserContextHolder.holder.remove();
        }
    }
    
    class UserContextHolder {
    
        public static ThreadLocal holder = new ThreadLocal<>();
    
    
    }
    
    class User {
    
        String name;
    
        public User(String name) {
            this.name = name;
        }
    }

    注意点:

    4 ThreadLocal方法使用总结

    场景一:initialValue

    在ThreadLocal第一次get的时候把对象给初始化出来,对象的初始化时机可以由我们控制。

    场景二:set

    如果需要保存到ThreadLocal里面的对象的生成时机不由我们随意控制。例如拦截器生成的用户信息,用ThreadLocal.set直接放到ThreadLocal当中。

    5 ThreadLocal原理

    理清Thread,ThreadLocalMap以及ThreadLocal

    主要方法介绍

    ThreadLocalMap发生冲突之后,会用线性探测法。

    6 ThreadLocal使用问题内存泄露

    什么是内存泄露:某个对象不再有用,但是占用的内存却不能被回收。

    Value的泄露

    如何避免内存泄露呢?

    7 实际应用场景-在spring中的实例分析

    到此这篇关于Java之ThreadLocal使用常见和方式案例讲解的文章就介绍到这了,更多相关Java之ThreadLocal使用常见和方式内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

    相关内容

    热门资讯

    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...