返回顶部
首页 > 资讯 > 精选 >ThreadLocal怎么用
  • 808
分享到

ThreadLocal怎么用

threadlocal 2023-05-30 21:05:10 808人浏览 安东尼
摘要

这篇文章主要介绍了ThreadLocal怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. ThreadLocal<T> 简介和使用示例ThreadLoca

这篇文章主要介绍了ThreadLocal怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. ThreadLocal<T> 简介和使用示例

ThreadLocal只有一个无参的构造方法

public ThreadLocal()

ThreadLocal的相关方法

public T get()
public void set(T value)
public void remove()
protected T initialValue()

initialValue方法的访问修饰符是protected,该方法为第一次调用get方法提供一个初始值。默认情况下,第一次调用get方法返回值null。在使用时,我们一般会复写ThreadLocal的initialValue方法,使第一次调用get方法时返回一个我们设定的初始值。

下面是一个ThreadLocal的一个简单使用示例

package javalearning;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class ThreadLocalDemo {private ThreadLocal<Integer> tlA = new ThreadLocal<Integer>(){protected Integer initialValue(){return 3;}};Semaphore semaphore = new Semaphore(1);private Random rnd = new Random();public class Worker implements Runnable{@Override    public void run(){try {Thread.sleep(rnd.nextint(1000));semaphore.acquire();}catch (InterruptedException e) {e.printStackTrace();}int valA = tlA.get();System.out.println(Thread.currentThread().getName() +" tlA initial val : "+ valA);valA = rnd.nextint();tlA.set(valA);System.out.println(Thread.currentThread().getName() +" tlA new   val: "+ valA);semaphore.release();tlA.remove();}}public static void main(String[] args){ExecutorService es = Executors.newFixedThreadPool(3);ThreadLocalDemo tld = new ThreadLocalDemo();es.execute(tld.new Worker());es.execute(tld.new Worker());es.execute(tld.new Worker());es.shutdown();}}

运行结果

pool-1-thread-1 tlA initial val : 3pool-1-thread-1 tlA new   val: -1288455998pool-1-thread-3 tlA initial val : 3pool-1-thread-3 tlA new   val: 112537197pool-1-thread-2 tlA initial val : 3pool-1-thread-2 tlA new   val: -12271334

从运行结果可以看出,每个线程第一次调用TheadLocal对象的get方法时都得到初始值3,注意我们上面的代码是让三个线程顺序执行,显然从运行结果看,pool-1-thread-1线程结束后设置的新值,对pool-1-thread-3线程是没有影响的,pool-1-thread-3线程完成后设置的新值对pool-1-thread-2线程也没有影响。这就仿佛把ThreadLocal对象当做每个线程内部的对象一样,但实际上tlA对象是个外部类对象,内部类Worker访问到的是同一个tlA对象,也就是说是被各个线程共享的。这是如何做到的呢?我们现在就来看看ThreadLocal对象的内部原理。

2.ThreadLocal<T>的原理

首先,在Thread类中定义了一个threadLocals,它是ThreadLocal.ThreadLocalMap对象的引用,默认值是null。ThreadLocal.ThreadLocalMap对象表示了一个以开放地址形式的散列表。当我们在线程的run方法中第一次调用ThreadLocal对象的get方法时,会为当前线程创建一个ThreadLocalMap对象。也就是每个线程都各自有一张独立的散列表,以ThreadLocal对象作为散列表的key,set方法中的值作为value(第一次调用get方法时,以initialValue方法的返回值作为value)。显然我们可以定义多个ThreadLocal对象,而我们一般将ThreadLocal对象定义为static类型或者外部类中。上面所表达的意思就是,相同的key在不同的散列表中的值必然是独立的,每个线程都是在各自的散列表中执行操作。

ThreadLocal怎么用

TheadLocal中的get源代码

public T get() {  Thread t = Thread.currentThread();  ThreadLocalMap map = getMap(t);  if (map != null) {    ThreadLocalMap.Entry e = map.getEntry(this);//这里的this是指当前的ThreadLocal对象    if (e != null) {      @SuppressWarnings("unchecked")      T result = (T)e.value;      return result;    }  }  return setInitialValue();}

感谢你能够认真阅读完这篇文章,希望小编分享的“ThreadLocal怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: ThreadLocal怎么用

本文链接: https://lsjlt.com/news/221225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ThreadLocal怎么用
    这篇文章主要介绍了ThreadLocal怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. ThreadLocal<T> 简介和使用示例ThreadLoca...
    99+
    2023-05-30
    threadlocal
  • java中ThreadLocal怎么用
    这篇文章将为大家详细讲解有关java中ThreadLocal怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。package test;public class Threa...
    99+
    2023-06-02
  • Java中的ThreadLocal怎么用
    这篇文章给大家分享的是有关Java中的ThreadLocal怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。引言ThreadLocal的官方API解释为:“该类提供了线程局部 (thread-local) &...
    99+
    2023-06-17
  • Java中ThreadLocal类怎么使用
    这篇文章主要介绍“Java中ThreadLocal类怎么使用”,在日常操作中,相信很多人在Java中ThreadLocal类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中ThreadLoca...
    99+
    2023-06-29
  • ThreadLocal怎么在Java中使用
    今天就跟大家聊聊有关ThreadLocal怎么在Java中使用 ,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一.对ThreadLocal的理解ThreadLocal,很多地方叫做线...
    99+
    2023-05-31
    java threadlocal ava
  • Java中ThreadLocal有什么用
    这篇文章将为大家详细讲解有关Java中ThreadLocal有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线...
    99+
    2023-06-15
  • C#线程绑定ThreadLocal类怎么使用
    本篇内容主要讲解“C#线程绑定ThreadLocal类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#线程绑定ThreadLocal类怎么使用”吧!在.Net 4.0的Thread里,...
    99+
    2023-07-02
  • 什么是ThreadLocal
    这期内容当中小编将会给大家带来有关什么是ThreadLocal,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一 引言ThreadLocal的官方API解释为:* ...
    99+
    2024-04-02
  • ThreadLocal使用方法是什么
    这篇“ThreadLocal使用方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ThreadLocal使用方法是什么...
    99+
    2023-06-29
  • 怎么在java中使用ThreadLocal隔离线程
    这期内容当中小编将会给大家带来有关怎么在java中使用ThreadLocal隔离线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编...
    99+
    2023-06-14
  • ThreadLocal好不好用
    这篇文章主要介绍“ThreadLocal好不好用”,在日常操作中,相信很多人在ThreadLocal好不好用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ThreadLoca...
    99+
    2024-04-02
  • ThreadLocal如何使用
    这篇文章给大家分享的是有关ThreadLocal如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。ThreadLocal的基本使用创建一个ThreadLocal对象:priv...
    99+
    2024-04-02
  • ThreadLocal内存泄漏怎么预防
    这篇文章主要介绍“ThreadLocal内存泄漏怎么预防”,在日常操作中,相信很多人在ThreadLocal内存泄漏怎么预防问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ThreadLocal内存泄漏怎么预防...
    99+
    2023-06-29
  • java ThreadLocal怎么创建和访问
    今天小编给大家分享一下java ThreadLocal怎么创建和访问的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、创建,...
    99+
    2023-06-30
  • Java中ThreadLocal的原理是什么及怎么使用
    这篇文章主要介绍“Java中ThreadLocal的原理是什么及怎么使用”,在日常操作中,相信很多人在Java中ThreadLocal的原理是什么及怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Jav...
    99+
    2023-07-06
  • python中ThreadLocal的作用是什么
    这篇文章主要介绍“python中ThreadLocal的作用是什么”,在日常操作中,相信很多人在python中ThreadLocal的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中Th...
    99+
    2023-07-05
  • springboot如何使用ThreadLocal
    这篇文章将为大家详细讲解有关springboot如何使用ThreadLocal,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。springboot 使用ThreadLocal在spring boot中使用T...
    99+
    2023-06-21
  • 怎么理解Python中的ThreadLocal变量
    这篇文章主要讲解了“怎么理解Python中的ThreadLocal变量”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Python中的ThreadLo...
    99+
    2024-04-02
  • threadlocal跨线程传递怎么实现
    要实现ThreadLocal的跨线程传递,可以使用InheritableThreadLocal类。InheritableThread...
    99+
    2023-09-26
    threadlocal
  • java中ThreadLocal是什么
    ThreadLocal是JDK包提供的,称为线程本地变量,它将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本,通过ThreadLocal可以将对象的可见范围限制在同一个线程内,从而避免了线程安全问题,对解决多线程程序的并发问题有一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作