iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >彻底理解Java 中的ThreadLocal
  • 601
分享到

彻底理解Java 中的ThreadLocal

javathreadlocalava 2023-05-31 11:05:33 601人浏览 安东尼
摘要

 ThreadLocal是什么  早在jdk 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 

 ThreadLocal是什么

  早在jdk 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

  当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

  从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。

  所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。

ThreadLocal的接口方法

ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:

  • void set(Object value)设置当前线程的线程局部变量的值。
  • public Object get()该方法返回当前线程所对应的线程局部变量。
  • public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

  值得一提的是,在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal<T>。api方法也相应进行了调整,新版本的API方法分别是void set(T value)、T get()以及T initialValue()。

  ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。我们自己就可以提供一个简单的实现版本:

package com.test; public class TestNum {  // ①通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值  private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>() {   public Integer initialValue() {    return 0;   }  };  // ②获取下一个序列值  public int getNextNum() {   seqNum.set(seqNum.get() + 1);   return seqNum.get();  }  public static void main(String[] args) {   TestNum sn = new TestNum();   // ③ 3个线程共享sn,各自产生序列号   TestClient t1 = new TestClient(sn);   TestClient t2 = new TestClient(sn);   TestClient t3 = new TestClient(sn);   t1.start();   t2.start();   t3.start();  }  private static class TestClient extends Thread {   private TestNum sn;   public TestClient(TestNum sn) {    this.sn = sn;   }   public void run() {    for (int i = 0; i < 3; i++) {     // ④每个线程打出3个序列值     System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn["        + sn.getNextNum() + "]");    }   }  } } 

--结束END--

本文标题: 彻底理解Java 中的ThreadLocal

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 彻底理解Java 中的ThreadLocal
     ThreadLocal是什么  早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ...
    99+
    2023-05-31
    java threadlocal ava
  • 彻底了解java中ReentrantLock和AQS的源码
    一.前言 首先在聊ReentrantLock之前,我们需要知道整个JUC的并发同步的基石,currrent里面所有的共享变量都是由volatile修饰的,我们知道volatile的语...
    99+
    2024-04-02
  • 彻底理解golang中什么是nil
    nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于n...
    99+
    2024-04-02
  • AndroidOkHttp代理与路由的彻底理解
    目录代理什么是代理?代理的类型代理选择器路由什么是路由?路由数据库路由选择器RouteSelector 内部类 SelectionRouteSelector 成员变量Rou...
    99+
    2023-03-09
    Android OkHttp代理路由 Android OkHttp
  • Java中的ThreadLocal详解
    目录一、ThreadLocal简介二、ThreadLocal简单使用 三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现四、Threa...
    99+
    2024-04-02
  • 彻底理解 Python 生成器
    1. 生成器定义 在Python中,一边循环一边计算的机制,称为生成器:generator。   2. 为什么要有生成器 列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。 如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空...
    99+
    2023-01-30
    生成器 Python
  • 带你彻底理解JavaScript中的原型对象
    目录一、什么是原型1.1 函数的原型对象1.2 使用构造函数创建对象二、与原型有关的几个属性和方法2.1 prototype属性2.2 constructor属性2.3 __prot...
    99+
    2024-04-02
  • 详解Java中的ThreadLocal
    目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现四、Thread...
    99+
    2024-04-02
  • 怎么彻底理解红黑树
    本篇内容主要讲解“怎么彻底理解红黑树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么彻底理解红黑树”吧!二叉树满足以下两个条件的树就是二叉树:本身是有序树(若...
    99+
    2024-04-02
  • 如何彻底理解Go指针
    如何彻底理解Go指针,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是指针简单点说,指针是指向另一个地址的值。这是教科书上的解释,但如果你转自一门不用谈论变量...
    99+
    2023-06-16
  • 一文带你彻底剖析Java中Synchronized原理
    目录源码级别剖析Synchronized对象结构Monitor 对象Synchronized特征原子性可见性有序性可重入锁锁升级的过程源码级别剖析Synchronized 对象结构 ...
    99+
    2023-05-18
    剖析Java中的Synchronized Java Synchronized
  • Java中ThreadLocal的用法和原理详解
    目录用法实现原理内存泄漏用法 隔离各个线程间的数据避免线程内每个方法都进行传参,线程内的所有方法都可以直接获取到ThreadLocal中管理的对象。 package com.exam...
    99+
    2023-05-15
    Java ThreadLocal用法 Java ThreadLocal原理 Java ThreadLocal
  • 彻底理解Spring注解@Autowired实现原理
    目录前言1、@Autowired注解用法2、@Autowired注解的作用到底是什么3、@Autowired注解是如何实现的自己实现一个注解4、@Autowired注解实现逻辑分析5...
    99+
    2024-04-02
  • 一文彻底了解Java的组合模式
    目录1、什么是组合模式2、组合模式定义3、组合模式通用代码实现4、组合模式优点5、组合模式应用场景相信树形结构大家都知道,但是你是否知道用到了什么设计模式吗? 1、什么是组合模式 C...
    99+
    2023-02-24
    Java组合模式使用 Java组合模式
  • Java数据结构彻底理解关于KMP算法
    大家好,前面的有一篇文章讲了子序列和全排列问题,今天我们再来看一个比较有难度的问题。那就是大名鼎鼎的KMP算法。 本期文章源码:GitHub源码 简介 KMP算法是一种改进的字符串...
    99+
    2024-04-02
  • 彻底理解JavaScript的原型与原型链
    目录前言基础铺垫prototypecontructor属性__proto__原型链提高总结后语前言 原型与原型链知识历来都是面试中考察的重点,说难不算太难,但要完全理解还是得下一定...
    99+
    2024-04-02
  • 三张图彻底了解Java中字符串的不变性
    该文章是图说Java系列文章中的一篇定义一个字符串String s = "abcd";...
    99+
    2023-05-31
    java 字符串 不变性
  • 让你五分钟彻底理解Spring MVC
    目录概述MVC 架构模式传统 MVC 架构模式Java Web MVC 架构模式Spring MVC 架构模式Hello,Spring MVCSpring MVC 依赖引入Dispa...
    99+
    2024-04-02
  • 深入理解python中的ThreadLocal
    ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。 它的主要作用是存储当前线程的变量,各个线程之间的变量名是可以相同的,但是线程之间的变量是隔离的,也...
    99+
    2023-03-08
    python ThreadLocal
  • 彻底弄懂Base64的编码与解码原理
    Base64是一种用于将二进制数据转换为可打印字符的编码方式。它使用64个字符来表示任意二进制数据,包括字母(大写和小写)、数字以及...
    99+
    2023-09-23
    Base64
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作