java之ThreadLocal原理总结

Java中的ThreadLocal的使用与原理 Threadlocal 本文主要介绍ThreadLocal的基本使用与底层原理,欢迎大家相互学习与指正。 1.ThreadLocal定义 ThreadLocal是线程的局部变量,即使用ThreadLocal可以使用变量成为当前线程所独有的,对其他线程隔离。 ThreadLocal提供线程本地的实例,它与普通线程的区别:每个使用该变量的线程都会初始化一个完成独立的实例副本。 ThreadLocal变量通常用private static修饰,适用于变量在线程间隔离而在方法与类间共享的情况。 2.ThreadLo 阅读详情

前言

多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个 共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这显然加重了使用者的 负担。那么有没有一种方式可以做到,当创建一个变量后,每个线程对其进行访问的时候访问的是自己线程的变量呢?其实 ThreadLocal就可以做这件事情,虽然 ThreadLocal并不是为了解决这个问题而出现的。

yv7Ltv

ThreadLocal简介和使用

ThreadLocal是JDK lang包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题。创建一个ThreadLocal变量后,每个线程都会复制一个变量到自己的本地内存。

YZv4po


ThreadLocal原理

首先看一下ThreadLocal的类图,如下:

1tC9qY

从该类图可以看到,在Thread类中有一个theradLocals和inheritableThreadLocals的map结构属性,都是ThreadLocalMap类型,可以理解为一个定制化的HashMao。

默认情况下,每个线程的这俩属性都为null。只有当线程第一次调用ThreadLocal中的set或者get方法时才会创建他们。

这里有个重点就是每个线程的本地变量不是存放在ThreadLocal实例里面的,而是存放在调用线程的threadLocals变量里面。所以可以把ThreadLocal理解成一个工具类。

ThreadLocal工具类在调用set的时候将value存放在调用线程的threadLocals里面。当调用线程调用ThreadLocal的get 方法是,则用threadLocals里面将其拿出来。如果线程一直不终止,这个本地变量也会一直存放在调用线程的threadLocals里面,所以不需要的时候要记得remove掉。

threadLocals和inheritableThreadLocals都是是Map结构说明每个线程可以存放多个本地变量。

源码分析

  • ThreadLocalMap

    ThreadLocal的内部类,其中的内部类Entry继承了WeakReference(弱引用)

    弱引用相关和Threadlocal中Entry为什么使用弱引用的相关链接:

    https://www.cnblogs.com/gudi/p/6403953.html

    https://www.jianshu.com/p/964fbc30151a
    https://www.cnblogs.com/zjj1996/p/9140385.html

    https://blog.youkuaiyun.com/qq_42862882/article/details/89820017?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1328602.9405.16149115671133691&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

    KO0y62

    首先弱引用就是在gc的时候去回收。如上图,在栈中存在ThreadLocal的引用,图中的虚线部分为弱引用,

    反证一下:如果虚线部分也是实线,也就是强引用,当栈中的ThreadLocalRef = null后,ThreadLocal 当前线程的threadLocalMap中还是有强引用,就回收不了了,导致内存泄露,所以将key设置为了弱引用。

    假如每个key都强引用指向threadlocal,也就是上图虚线那里是个强引用,那么这个threadlocal就会因为和entry存在强引用无法被回收!造成内存泄漏 ,除非线程结束,线程被回收了,map也跟着回收。

    虽然上述的弱引用解决了key,也就是线程的ThreadLocal能及时被回收,但是value却依然存在内存泄漏的问题。

    当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.

    map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露,因为存在一条从current thread连接过来的强引用.

    只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收。所以当线程的某个localThread使用完了,马上调用threadlocal的remove方法,那就啥事没有了!

    另外其实只要这个线程对象及时被gc回收,这个内存泄露问题影响不大,但在threadLocal设为null到线程结束中间这段时间不会被回收的,就发生了我们认为的内存泄露。

    最要命的是线程对象不被回收的情况,这就发生了真正意义上的内存泄露。比如使用线程池的时候,线程结束是不会销毁的,会再次使用的。就可能出现内存泄露。

    最后补充一点:Java为了最小化减少内存泄露的可能性和影响,在ThreadLocal的get,set的时候都会清除线程Map里所有key为null的value。

  • set

public void set(T value) {
  // 获取当前线程
  Thread t = Thread.currentThread();
  // 将当前线程传入获取threadLocals,获取的是当前线程自身的map
  ThreadLocalMap map = getMap(t);
  if (map != null)
    map.set(this, value);
  else
  // 第一次条用就床架您当前线程对应的threadLocals
    createMap(t, value);
}

ThreadLocalMap getMap(Thread t) {
  return t.threadLocals;
}

void createMap(Thread t, T firstValue) {
  t.threadLocals = new ThreadLocalMap(this, firstValue);
}

getMap(t)的作用是获取线程自己的变量threadLocals, ThreadLocal变量被绑定到了线程的成员变量上。

如果getMap()的返回值不为空,则把 value值设置到 threadLocals中,也就是把当前变量值放入当前线程的内存变量threadLocals中。

threadLocals是一个 Hashmap结构,其中key就是当前ThreadLocal的实例对象引用, value是通过set方法传递的值。

如果getMap(t)返回空值则说明是第一次调用set方法,这时创建当前线程的threadlocals变量。

createMap(t,firstValue)创建了当前线程的ThreadLocals变量。

  • get
public T get() {
  // 获取当前线程
  Thread t = Thread.currentThread();
  // 获取当前线程的threadLocals map
  ThreadLocalMap map = getMap(t);
  if (map != null) {
    // 如果map已经初始化了,传入Threadlocal这个本地线程变量(set的时候this为key) 取出value
    ThreadLocalMap.Entry e = map.getEntry(this);
    if (e != null) {
      @SuppressWarnings("unchecked")
      T result = (T)e.value;
      return result;
    }
  }
  // 如果threadLocals为null,则初始化
  return setInitialValue();
}

private T setInitialValue() {
  T value = initialValue(); // null
  Thread t = Thread.currentThread();
  ThreadLocalMap map = getMap(t);
  if (map != null)
    map.set(this, value);
  else
    createMap(t, value);
  return value;
}
  • remove
public void remove() {
  ThreadLocalMap m = getMap(Thread.currentThread());
  if (m != null)
    m.remove(this);
}

如果threadLocals不为null,删除ThradLocal实例的本地变量。

总结

在每个线程内部都有一个名为threadLocals的成员变量,该变 量的类型为Hashmap,其中key为我们定义的ThreadLocal变量的this引用, value则为我 们使用set方法设置的值。每个线程的本地变量存放在线程自己的内存变量threadLocals中,如果当前线程一直不消亡,那么这些本地变量会一直存在,所以可能会造成内存溢出,因此使用完毕后要记得调用ThreadLocal的 remove方法删除对应线程的threadlocals中的本地变量。

oh2Qf7

InheritableThreadLocal

ThreadLocal不支持继承性,比如说父线程中的ThreadLcoal在其子线程中时不可见的。因为在子线程里面调用get方法时是获取当前线程的threadLocals对象,所以获取不到父线程的本地变量是正常的。

为了解决上述问题,出现了InheritableThreadLocal这个类。

InheritableThreadLocal继承了ThreadLocal类,并提供了一个特性,就是让子线程可以访问在父线程中设置的本地变量。

protected T childValue(T parentValue) {
  return parentValue;
}
   
ThreadLocalMap getMap(Thread t) {
  // 返回的是inheritableThreadLocals
  return t.inheritableThreadLocals;
}
   
void createMap(Thread t, T firstValue) {
  // 创建的是inheritableThreadLocals而不是threadLocals
  t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
}

InheritableThreadLocal继承了ThreadLocal ,并重写了三个方法。

在Thread的构造器中有这样一段代码:

private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc,
                  boolean inheritThreadLocals) {
  ...
  // 获取当前线程,也就是父线程
  Thread parent = currentThread();
	...
  if (inheritThreadLocals && parent.inheritableThreadLocals != null)
    // 如果父线程的inheritableThreadLocals 不为null,则将父线程的inheritableThreadLocals也赋值为子线程
    this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
}

追踪createInheritedMap可以看到这个方法:

private ThreadLocalMap(ThreadLocalMap parentMap) {
  Entry[] parentTable = parentMap.table;
  int len = parentTable.length;
  setThreshold(len);
  table = new Entry[len];

  for (int j = 0; j < len; j++) {
    Entry e = parentTable[j];
    if (e != null) {
      @SuppressWarnings("unchecked")
      ThreadLocal<Object> key = (ThreadLocal<Object>) e.get();
      if (key != null) {
        // 这里调用了重写的方法,获取父线程中的value
        Object value = key.childValue(e.value);
        Entry c = new Entry(key, value);
        int h = key.threadLocalHashCode & (len - 1);
        while (table[h] != null)
          h = nextIndex(h, len);
        table[h] = c;
        size++;
      }
    }
  }
}

所以将ThreadLocal实例初始化为InheritableThreadLocal就拥有了继承性,在子类连就可以调用父类的本地变量了

那么在什么情况下需要子线程可以获取父线程的 threadlocal变量呢?

情况还是蛮多的,比如子线程需要使用存放在 threadlocal变量中的用户登录信息,再比如一些中间件需要把统一的id追踪的整个调用链路记录下来。

其实子线程使用父线程中的 threadlocal方法有多种方式,比如创建线程时传入父线程中的变量,并将其复制到子线程中,或者在父线程中构造一个map作为参数传递给子线程,但是这些都改变了我们的使用习惯,所以在这些情况下InheritableThreadlocal就显得比较有用。

总结

本文学习了总结了ThreadLocal的设计初衷和实现原理,并介绍了InheritableThreadLocal实现了本地变量的可继承性,也简单介绍了弱引用等知识点。

参考资料:《java并发编程之美》

by – 俩只猴

什么是ThreadLocal,一篇文章彻底搞懂Java多线程中的ThreadLocal【保姆级教程】 多线程、Thread、java 阅读详情

相关推荐

JAVA线程基础——ThreadLocal的使用和原理

如图1-6所示,在每个线程内部都有一个名为threadLocals的成员变量,该变量的类型为 HashMap,其中 key 为我们定义的 ThreadLocal 变量的 this引用,value 则为我们使用set方法设置的值。每个线程的本地变量存放在线程自己的内存变量threadLocals中,如果当前线程一直不消亡,那么这些本地变量会一直存在,所以可能会造成内存溢出,因此使用完毕后要记得调用 ThreadLocal的remove 方法删除对应线程的threadLocals中的本地变量。

weixin_45826852的博客 2758

【Java】ThreadLocal原理

每个线程都会有属于自己的本地内存,在堆(也就是上图的主内存)中的变量在被线程使用的时候会被复制一个副本线程的本地内存中,当线程修改了共享变量之后就会通过。​ 很明显,在多线程的场景下,当有多个线程对共享变量进行修改的时候,就会出现线程安全问题,即数据不一致问题。类,来修饰共享变量,使每个线程都单独拥有一份共享变量,这样就可以做到线程之间对于共享变量的隔离问题。实例中的,但实际上不是的,这种说法只是让我们更好的理解。生命周期长的线程可以理解为:线程池的核心线程。的线程一直持续运行如线程池中的线程,那么这个。

qq_44544908的博客 1232

Java并发编程之ThreadLocal认识和原理

通过当前线程对象 thread 获取该 thread 所维护的 ThreadLocalMap,如果 ThreadLocalMap 不为 null,则以 ThreadLocal 实例为 key,值为 value 的键值对存入 ThreadLocalMap,若 ThreadLocalMap 为 null 的话,就新建 ThreadLocalMap,然后再以 ThreadLocal 为键,值为 value 的键值对存入即可。

天天新知 1166

Java ThreadLocal 原理详解及使用

在调用 ThreadLocal 的 remove 方法时,它会获取当前线程的 ThreadLocalMap 对象,并从中删除该线程对应的变量副本。ThreadLocal 是一个本地线程变量,它为每个线程提供了一个独立的变量副本,使得每个线程只能访问自己的变量。例如,当多个线程访问同一个变量时,我们可以将该变量封装到每个线程中,使得每个线程只能访问自己的变量,避免了线程间的竞争。线程池中的线程是可以重用的,因此当线程被重用时,ThreadLocal 存储的变量可能会出现错误。

兴趣是最好的老师,勤能补拙 887

基于STM32的家用新风系统智能控制器 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了家用新风系统智能控制器的全功能开发,覆盖多传感器数据采集、双模式控制、PID调速、异常报警、掉电记忆等核心功能,全程采用保姆式无跳步教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 464

手把手教你用Logisim搞定华科计组实验:单总线CPU硬布线控制器设计(含Excel自动生成电路技巧)

本文详细解析了如何使用Logisim完成华科计组实验中的单总线CPU硬布线控制器设计,特别分享了利用Excel自动生成电路逻辑的高效技巧。从实验准备、状态机表格填写到模块化构建和系统联调,提供全流程实战指导,帮助读者快速掌握计算机组成原理核心概念,大幅提升实验效率。

weixin_28744423的博客 321

深入剖析Java中ThreadLocal原理

看完你应该对有个全新的认识了,虽然概念很容易理解,但我们知其然更要知其所以然。通过现象看本质。

WriteBug001的博客 802

从BSCAN到BAP:深度解析Tessent MBIST逻辑的协同工作机制与设计考量

本文深入解析了Tessent MBIST逻辑中BSCAN Interface、Logic Group Def、Controller与BAP模块的协同工作机制。文章以一条测试指令的完整路径为例,详细阐述了数据流与控制流如何跨模块、跨时钟域协同工作,并重点探讨了MBIST BAP在协议转换与流量管理中的核心桥梁作用,为芯片内建自测试的集成与调试提供了关键的设计考量和实战技巧。

kappa的博客 482

Java ThreadLocal原理

概述 threadlocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。

jiangwayne的博客 687

别再只仿真原理图了!用ADS做微带功分器,版图仿真这一步才是关键

本文深入探讨了使用ADS进行微带功分器设计时版图仿真的重要性,指出原理图仿真与版图仿真的本质差异及其对性能的影响。通过详细分析版图效应、关键设置和优化策略,帮助工程师避免常见陷阱,提升设计效率和准确性。文章特别强调了版图仿真在确保微波电路性能中的关键作用。

weixin_42561476的博客 412

基于八叉树的k近邻搜索

在八叉树中,每个节点都表示一个正方体的体积元素(体素),并且每个节点都有八个子节点(在不为空的情况下)。搜索最近邻点:一旦确定了查询点在八叉树中的位置,就可以开始搜索最近邻点了。搜索过程通常从查询点所在的叶节点开始,并逐步扩展到相邻的叶节点和父节点,直到找到k个最近邻点为止。k近邻搜索的目标是在给定的点云数据中,找到一个查询点的k个最近邻点。定位查询点:在搜索过程中,首先需要确定查询点在八叉树中的位置。返回结果:最后,搜索算法会返回找到的k个最近邻点的索引和它们与查询点之间的距离。

twnkie的博客 674

java threadlocal原理_Java ThreadLocal 原理分析

ThreadLocal提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同。ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定。This class provides thread-local variables. These variables differ from their normal counterparts in ...

weixin_36210904的博客 240

<IBM AIX> 《HACMP 实用手册和命令 HA切换手册》 - 鸿篇巨制,全网最全

操作命令检查磁盘预留策略要将磁盘预留策略更改为 no_reserve集群状态实用程序查看集群状态是否正常SMIT System Management (C-SPOC)Cluster ServicesShow Cluster Services 面板上的选项或 lssrc 命令查看资源组、资源组对应的VG、资源组对应的APPLICATION SERVER# ./cldispsmit常用命令F3退出F4列表Esc+6或者F6查看命令Esc+7或者F7选择多项检查状态。

Else 的博客 3363

java ThreadLocal原理和使用

假如threadLocal1不用了,要回收ThreadLocal对象,而如果map强引用这个ThreadLocal对象,将导致这个ThreadLocal对象回收不了。当ThreadLocalMap里面的key被回收,这使得value就访问不到,也需要回收;但是value的引用是存在的,这就会导致内存泄漏。比如一个查询,要经过一层一层处理,最后还要记录此次的查询记录;弱引用做了一道工作,但是仍需要显示的remove掉ThreadLocal的value。并不是一个线程,而是线程的一个局部变量(属于线程)

master-dragon的专栏 1022

系规备考论文:论IT服务规划设计

系规备考论文:论IT服务规划设计

liuxu324的博客 1144

OpenClaw 开机自启配置:Windows/macOS/Linux 全平台技术指南

OpenClaw 开机自启全平台配置指南 本文提供了在Windows、macOS和Linux系统上配置OpenClaw开机自启的完整技术方案。主要内容包括: Windows配置:提供三种方法(Windows服务、任务计划程序、启动文件夹),详细说明服务脚本创建、服务注册和测试流程 macOS配置:使用LaunchAgent实现开机自启,包含配置文件创建和加载方法 Linux配置:通过systemd服务实现,包括服务单元文件创建和启用步骤 系统要求:明确硬件(64位CPU/4GB内存)和软件(各平台操作系统版

一键难忘的博客 2993

java ThreadLocal原理

ThreadLocal的线程私有实现原理

weixin_43837293的博客 951

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java ThreadLocal(从原理到实战)

ThreadLocal 被称为线程局部变量,用于在线程中保存数据。由于在 ThreadLocal 中保存的数据仅属于当前线程,所以该变量对于其他线程而言是隔离的,也就是说该变量是当线程独有的变量。ThreadLocal 用于在同一线程间,在不同的类和方法之间共享数据的场景,也可以用于在不同线程间隔离数据的场景。单 ThreadLocal 场景:用 Thread 作键看似可行,但无实际意义(ThreadLocal 本身的设计更简洁、内聚)。

优快云_xysf的博客 1058

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java—ThreadLocal底层实现原理

首先,ThreadLocal 本身并不提供存储数据的功能,当我们操作 ThreadLocal 的时候,实际上操作。这个成员变量的类型是 ThreadLocal 的一个内部类 ThreadLocalMap,它是真正用来存储数据的容器。因此,不同线程间的数据从物理上就是隔离的,所以 ThreadLocal 不需要任何同步机制也天然是线程安全的。

2302_80434765的博客 1155

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java ThreadLocal原理和用法

Java类使您能够创建只能由同一线程读取和写入的变量。因此,即使两个线程正在执行相同的代码,并且该代码引用了相同的变量 ThreadLocal,这两个线程也无法看到彼此的ThreadLocal变量。因此,Java ThreadLocal 类提供了一种简单的方法来使代码线程安全,否则就不会如此。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2759

Java ThreadLocal 原理简介

首先看以下代码: public class Main { public static class MyRunnable implements Runnable { int val = 0; @Override public void run() { val = (int) (Math.random()*100); try { Thread.sleep(2000);

weixin_46406553的博客 243

Java ThreadLocal 的原理

ThreadLocal 是 Java 提供的线程本地存储工具,核心作用是为每个线程创建独立的变量副本,让每个线程操作自己的副本,避免多线程共享变量导致的线程安全问题。可以把它理解为:给每个线程配一个专属的 “储物柜”,线程只能存取自己柜子里的东西,互不干扰。ThreadLocal 核心是为每个线程创建独立的变量副本,实现线程数据隔离,解决多线程共享变量的线程安全问题;底层依赖 Thread 类中的 ThreadLocalMap 存储数据,ThreadLocal 仅作为 key 定位副本;

2501_94473255的博客 1027

java threadlocal原理_Java ThreadLocal原理解析

简介ThreadLocal的作用是在指定线程内存储数据,可以在对应的指定线程获取到数据,相当于是给线程提供了变量存储的能力。类似于MC里面的末影箱子。。用法定义时,使用泛型指定要存入的变量类型,然后通过get和set即可获取数据。原理看起来好像Java是在全局设置了一个以Thread为key,Class为子key,变量为值的map?(HashMap,Object>>)其实并不是,每个T...

weixin_39644915的博客 219

Java ThreadLocal详解:从原理到实践

Java ThreadLocal 核心解析与实践指南 ThreadLocal 是 Java 提供的线程本地存储机制,为每个线程创建独立变量副本,实现线程隔离和无锁并发。其核心原理基于 Thread 类中的 ThreadLocalMap 数据结构,通过 ThreadLocal 实例作为 key 来存取线程专属数据。典型应用包括解决 SimpleDateFormat 线程安全问题、用户会话管理和数据库连接控制等场景。 需特别注意 ThreadLocal 的内存泄漏风险:由于 Entry 的 key 是弱引用而

Broken_x的博客 1015

Java中的ThreadLocal原理,内存泄露原因

因为可能这个key是经过hash及线性探测而来到这个位置的,而可能上一个位置才是他hash后的位置(当然也有可能上上上个),而因为上一个位置已经指向null了,如果这个key不回到上个位置(或者上个位置之前的位置),就会在get(可以看上面的get()方法,如果获取到的Entry为null,则直接设置初始值了)这个key的时候永远get不到了,所有之后④⑤部操作都是为了让它回到上一个指向null的位置(或者null之前的位置)匹配成功,进入expungeStaleEntry方法进行Entry的清空。

mymic的博客 1051

请你说一下自己对ThreadLocal的理解(请你说说ThreadLocal的原理)—java并发知识

本文旨在作学习记录,部分内容源自JavaGuide,作者在此基础上进行补充说明、整理论述,使其能以一种更为逻辑地清晰地方式表达出“请你说一下自己对ThreadLocal的理解”的理解,更多适应于java面试回答,亦可作对ThreadLocal类的简要了解。 一、作用 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量,就需要用到ThreadLocal类。 如果你创建了一个ThreadLocal变量...

打球唔叻的博客 341
上一篇: JAVA 栈,为什么要使用Deque,而不推荐使用Stack,Deque中ArrayDeque与LinkedList的区别,Deque方法详解
下一篇: zookeeper节点故障之Unable to load database on disk
俩只猴
博客等级 码龄12年 11粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值