Java——》ThreadLocal

这篇具有很好参考价值的文章主要介绍了Java——》ThreadLocal。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】
    总结——》【Linux】
    总结——》【MongoDB】
    总结——》【Elasticsearch】

一、概念

ThreadLocal可以理解为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离,相比于synchronized的做法是用空间来换时间。
ThreadLocal的本质就是一个Map,ThreadLocal做为key,将一个数据和本地线程绑定在一起。

二、源码

ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了保存key value键值对的能力。
Java——》ThreadLocal,Java,java,线程,ThreadLocal,ThreadLocalMap,弱引用,内存泄漏,原子性
Java——》ThreadLocal,Java,java,线程,ThreadLocal,ThreadLocalMap,弱引用,内存泄漏,原子性

三、内部结构

Java——》ThreadLocal,Java,java,线程,ThreadLocal,ThreadLocalMap,弱引用,内存泄漏,原子性

四、特点

  • 每个Thread中都存储着一个成员变量ThreadLocalMap
  • ThreadLocal本身不存储数据,像是一个工具类,基于ThreadLocal去操作ThreadLocalMap
  • ThreadLocalMap本身就是基于Entry[]实现的,因为一个线程可以绑定多个ThreadLocal,这样一来,可能需要存储多个数据,所以采用Entry[]的形式实现。
  • 每一个现程都自己独立的ThreadLocalMap,再基于ThreadLocal对象本身作为key,对value进行存取
  • ThreadLocalMap的key是一个弱引用,弱引用的目的是为了防止内存泄露,如果是强引用那么ThreadLocal对象除非线程结束否则始终无法被回收,弱引用则会在下一次GC的时候被回收

五、内存泄漏问题

Java中4种引用:
强引用:OOM也不清除
软引用:内存不足清除
弱引用:只要GC就清除
虚引用:拿不到引用,构建出来就凉凉~~

Java——》ThreadLocal,Java,java,线程,ThreadLocal,ThreadLocalMap,弱引用,内存泄漏,原子性

1、现象

假如ThreadLocal对象被回收之后,key因为弱引用也会被GC回收掉,同时线程还没有被回收,entry中就存在key为null,但value有值的entry对象,但是内存中的value无法被获取到,同时也无法被回收,就会导致内存泄漏。

2、解决方案

使用TheadLocal完毕后,调用remove方法删除Entry对象
Java——》ThreadLocal,Java,java,线程,ThreadLocal,ThreadLocalMap,弱引用,内存泄漏,原子性

六、内存泄漏案例

参考链接:Java——》内存泄露案例

七、保证原子性

ThreadLocal保证原子性的方式,是不让多线程去操作临界资源让每个线程去操作属于自己的数据文章来源地址https://www.toymoban.com/news/detail-702893.html

static ThreadLocal tl1 = new ThreadLocal();
static ThreadLocal tl2 = new ThreadLocal();

public static void main(String[] args) {
    tl1.set("123");
    tl2.set("456");
    Thread t1 = new Thread(() -> {
        System.out.println("t1:" + tl1.get());
        System.out.println("t1:" + tl2.get());
    });
    t1.start();

    System.out.println("main:" + tl1.get());
    System.out.println("main:" + tl2.get());
}

到了这里,关于Java——》ThreadLocal的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java面试之ThreadLocal问题

    什么是ThreadLocal,它的基本用法是什么  简单来说就是能在多线程中保持变量独立的线程对象 不用Threadlocal多线程访问同一个变量会出现的问题 下面直接已经线程混乱   一般来说我们可以用锁来解决,比如引入synchronized,这里我们先不用锁,我们用ThreadLocal这个类去解决 Thr

    2024年02月09日
    浏览(29)
  • java 并发 随笔7 ThreadLocal源码走读

    可以看到 Thread 是内部是维护了局部变量的(thread-local-map) 很多的细节都在代码块中备注了

    2024年02月13日
    浏览(31)
  • java 浅谈ThreadLocal底层源码(通俗易懂)

    目录 一、ThreadLocal类基本介绍         1.概述 :          2.作用及特点 :  二、ThreadLocal类源码解读         1.代码准备 :              1.1 图示              1.2 数据对象             1.3 测试类             1.4 运行测试         2.源码分析 :              2.1 set方法解读

    2024年02月10日
    浏览(71)
  • Java中ThreadLocal的用法和原理

    隔离各个线程间的数据 避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到 ThreadLocal 中管理的对象。 使用 junit 进行测试: 结果如下,可以看到没有被 ThreadLocal 管理的变量已经无法匹配正确的format。 从 ThreadLocal 中获取数据的过程: 先获取对应的线程。

    2023年04月12日
    浏览(25)
  • 【JVM篇】ThreadLocal中为什么要使用弱引用

    ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全 ThreadLocal是这样子保存对象的: 在每个线程中,存放了一个ThreadLocalMap对象,本质上就是一个数组实现的哈希表,里面存放多个Entry对象 每个Entry对象继承自弱引用,内部存放ThreadLocal对象,同时用强引用,引用

    2024年02月20日
    浏览(36)
  • ThreadLocal :在 Java中隱匿的魔法之力

    优质博文:IT-BLOG-CN ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的

    2024年03月10日
    浏览(75)
  • 【从零开始学习Java重要知识 | 第二篇】深入解读ThreadLocal类

    目录 前言:  ThreadLocal:  ThreadLocal的内部结构:   ThreadLocal的常用方法: 1.set方法: 2.get方法: 3.setInitialValue方法 remove方法(): ThreadLocalMap:​编辑 成员变量: 存储结构:  高频考点: 总结:          当我们编写多线程程序时,经常会遇到一些需要在线程之间共

    2024年01月18日
    浏览(35)
  • 线程安全—ThreadLocal

    定义: ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为每个线程都创建了一个副本,存的是自己,那么每个线程可以访问自己内部的副本变量。 ThreadLocal是用空间换取时间,synchronized是用时间换空间。

    2024年02月11日
    浏览(25)
  • ThreadLocal 本地线程变量详解

    ThreadLocal 意为本地线程变量,即该变量只属于当前线程,对其他线程隔离 我们知道,一个普通变量如果被多线程访问会存在存在线程安全问题,这时我们可以使用 Synchronize 来保证该变量某一时刻只能有一个线程访问,从而解决并发安全问题 但如果这个变量并不需要被共享,

    2024年02月05日
    浏览(30)
  • ThreadLocal线程安全示例及其原理

    提示:多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的 ThreadLocal是用空间换取时间,synchronized关键

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包