首页 > 编程语言 >Java多线程中的ThreadLocal线程本地变量

Java多线程中的ThreadLocal线程本地变量

时间:2022-11-14 00:44:43浏览次数:48  
标签:main Java Thread get threadLocal ThreadLocal 线程 多线程

概论

ThreadLocal指的是开辟一块统一初始化的空间,在这个区域块里每个线程使用的区域独立,互不干扰。一般创建为对象的静态属性。

常用方法:

set (value)

get(value)

子类的initialValue()设置初始值。

示例:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            //初始化的值为2
            return 2;
        }
    };

    public static void main(String[] args) throws InterruptedException {
        //获取main线程的ThreadLocal区域存放的值
        System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        //修改
        threadLocal.set(20);
        //获取main线程的ThreadLocal区域存放的值
        System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        Test t = new Test();
        t.start();
    }
    //内部类
    static class Test extends Thread{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
            threadLocal.set(threadLocal.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
    }
}

运行结果:

注意事项

关注 ThreadLocal 的归属问题,1、在构造器中调用,哪个线程调用的,就属于谁。2、run方法中,就是自己的。

示例代码:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    private static ThreadLocal<Integer> threadLocal = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            //初始化的值为2
            return 2;
        }
    };

    public static void main(String[] args) throws InterruptedException {
        //修改main线程的值
        threadLocal.set(20);
        new Thread(new Test()).start();
    }
    //内部类
    static class Test implements Runnable{
        public Test(){
            //main线程调用的构造器
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
        @Override
        public void run() {
            threadLocal.set(threadLocal.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal.get());
        }
    }
}

运行结果:

 

 子类InheritableThreadLocal

一个存储区域可以往下带的子类,main线程开的Thread1,那么Thread1也使用这个区域。

示例代码:

public class LeaningThread {
    //线程存放数据的一块区域,每个线程相互独立。常用方法:set/get,子类的intialValue设置初始值
    //一个值可以往下带的子类,main开的Thread1,那么Thread1也使用这个区域
    private static ThreadLocal<Integer> threadLocal2 = new InheritableThreadLocal<>();

    public static void main(String[] args) throws InterruptedException {
        //修改main线程的值
        threadLocal2.set(20);
        new Thread(new Test()).start();
    }
    //内部类
    static class Test implements Runnable{
        public Test(){
            //main线程调用的构造器
            System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get());
        }
        @Override
        public void run() {
            threadLocal2.set(threadLocal2.get()-3);
            System.out.println(Thread.currentThread().getName()+":"+threadLocal2.get());
        }
    }
}

运行结果:

 

标签:main,Java,Thread,get,threadLocal,ThreadLocal,线程,多线程
From: https://www.cnblogs.com/lurenjia-bky/p/16887825.html

相关文章

  • Java中DCL单例模式设计
    概述单例:某个类,对外永远只有一个对象。实现步骤:/***单例模式:懒汉式套路基础上加入并发控制(synchronized、volatile),保证多线程环境下,对外始终只有一个对象。*1、......
  • JavaWeb笔记(4)
    1.get请求请求方式  get请求的资源路径[+?+请求参数]请求协议版本号  THPP/1.12.请求头key:value组成  不同的键值,表示不同的涵义GET请求的HTTP协议内......
  • Java语法概述
    1.JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些JDK=JRE+Java的开发工具(javac.exe、java.exe、javadoc.exe)JRE=JVM+Java核心类库2.为什么要配......
  • Java中指令重排在多线程中出现数据错误的例子
    概述听说当两条指令互相不依赖的时候,在cpu或者jvm那儿可能会为了提高性能而进行指令重排。数据依赖比如下面两条代码就没有数据依赖:int a=5;int b=2;这两条指......
  • java时间工具类
    packagecom.example.httpdemo2.utils;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayLi......
  • java——继承与多态——final关键字001
    final关键字概念与四种用法:          final关键字用于修饰类:             final关键字用于修饰成员方法:   ......
  • Java 序列化与反序列化
    (目录)一、说明序列化与反序列化是什么序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输反序列化:从文件中读取序列化对象,对它进行反序列化,恢......
  • Javascript的预解析
    浏览器不是直接运行JS的,是调用js引擎运行js.js引擎运行js分为两个步骤:1.预解析:js引擎会把js里面所有的var,以及所有的function提升到当前作用域的最前面2.代码执行......
  • Head First Java 读书笔记 15章
    第15章:网络与线程(网络联机)在Java中,所有网络运作的低层细节都已经由java.net函数库处理。Java中,传送和接收网络上的数据,是在链接上使用不同链接串流的输入和输出。什么......
  • Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
    一、标准CRUD使用对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢?我们先来看张图:1.1环境准备这里用的环境就是Java开发学习(四十)----MyBat......