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"));
    
  • 相关阅读:
    关于 L3 缓存行 cacheLIne 的研究!还是对程序有举足轻重的作用!
    所谓的科学,根本就没有解决问题的根本。如框架,框架再好,也需要内容。
    编译器开发,手动把汇编转 机器码
    测试HTML
    神奇的经历,顶上去保证上帝保佑你!!!!!
    ECS框架研究 ,unity 以及缓存行的研究
    AVX 指令详解 ,还有SSE指令
    关于 Visual Studio 2017 ,或2019 ,Installer 没检测到已安装的程序.以及C++ 创建项目失败
    TCP 协议 精解
    opc 相关组件
  • 原文地址:https://www.cnblogs.com/liukaifeng/p/10052659.html
Copyright © 2011-2022 走看看