zoukankan      html  css  js  c++  java
  • Java线程之ThreadLocal

    翻译:https://www.journaldev.com/1076/java-threadlocal-example?utm_source=website&utm_medium=sidebar&utm_campaign=Core-Java-Sidebar-Widget
    在这里插入图片描述

    简述

    ThreadLocal类用来提供线程内部的局部变量,这种变量在多线程环境下通过get或set方法访问,它能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一线程内多个方法间一些公共变量的传递的复杂性。

    ##事例
    这里有一个小示例,展示了java程序中ThreadLocal的使用,并证明每个线程都有自己的ThreadLocal变量副本

    package com.lkf.mulithread;
    
    import java.text.SimpleDateFormat;
    import java.util.Random;
    
    public class ThreadLocalExample implements Runnable{
    
        // SimpleDateFormat不是线程安全的,所以每个对象引用一个
        private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
            @Override
            protected SimpleDateFormat initialValue()
            {
                return new SimpleDateFormat("yyyyMMdd HHmm");
            }
        };
    
        public static void main(String[] args) throws InterruptedException {
            ThreadLocalExample threadLocalExample = new ThreadLocalExample();
            for(int i=0 ; i<10; i++){
                Thread t = new Thread(threadLocalExample, "Thread"+i);
                Thread.sleep(new Random().nextInt(1000));
                t.start();
            }
        }
    
        @Override
        public void run() {
            System.out.println("线程: "+Thread.currentThread().getName()+" 默认时间格式: "+formatter.get().toPattern());
            try {
                Thread.sleep(new Random().nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //时间格式在此更改,但是不会影响到其它线程
            formatter.set(new SimpleDateFormat());
    
            System.out.println("线程 "+Thread.currentThread().getName()+" 时间格式:"+formatter.get().toPattern());
        }
    
    }
    
    

    输出结果:

    线程:Thread0 默认时间格式: yyyyMMdd HHmm
    线程:Thread1 默认时间格式: yyyyMMdd HHmm
    线程:Thread2 默认时间格式: yyyyMMdd HHmm
    线程:Thread1 时间格式:yy-M-d ah:mm
    线程:Thread0 时间格式:yy-M-d ah:mm
    线程:Thread3 默认时间格式: yyyyMMdd HHmm
    线程:Thread2 时间格式:yy-M-d ah:mm
    线程:Thread3 时间格式:yy-M-d ah:mm
    线程:Thread4 默认时间格式: yyyyMMdd HHmm
    线程:Thread4 时间格式:yy-M-d ah:mm
    线程:Thread5 默认时间格式: yyyyMMdd HHmm
    线程:Thread5 时间格式:yy-M-d ah:mm
    线程:Thread6 默认时间格式: yyyyMMdd HHmm
    线程:Thread6 时间格式:yy-M-d ah:mm
    线程:Thread7 默认时间格式: yyyyMMdd HHmm
    线程:Thread7 时间格式:yy-M-d ah:mm
    线程:Thread8 默认时间格式: yyyyMMdd HHmm
    线程:Thread9 默认时间格式: yyyyMMdd HHmm
    线程:Thread8 时间格式:yy-M-d ah:mm
    线程:Thread9 时间格式:yy-M-d ah:mm
    

    从输出结果中看,线程1中修改了时间格式,但是线程2中的初始化格式与线程1一样,并没有受到影响,其它线程也如此

    更新

    ThreadLocal功能在Java8中得到增强,添加了一个新方法withInitial(),我们可以使用lambda表达式简单的创建ThreadLocal实例,如下:

    private static final ThreadLocal<SimpleDateFormat> formatter =
                ThreadLocal.withInitial
                        (() -> new SimpleDateFormat("yyyyMMdd HHmm"));
    
  • 相关阅读:
    计算机视觉资源合集
    EMZ-搭建DL模型的最简便的方式 | 附项目地址
    在边缘设备上拟合大型神经网络的方法总结
    归一化方法总结 | 又名“BN和它的后浪们“
    名词解释 | 论文中的Ablation study
    知识蒸馏的简要概述
    如何看待计算机视觉未来的走向(二)从产品的角度聊一聊
    STL源码分析--functional
    STL源码分析--algorithm
    STL源码分析--bitset
  • 原文地址:https://www.cnblogs.com/liukaifeng/p/10052659.html
Copyright © 2011-2022 走看看