ThreadLocal 简介
ThreadLocal 是什么
早在 JDK1.2 的版本中就提供了java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供
了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象。当工作于线程中的对象使用
ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本。所以每一
个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,这个变量
就像是线程的本地变量,这也是类名中"Local“所要表达的意思。
线程局部变量并不是Java的新发明,很多语言在语法层面就提供线程局部变量。在Java中没有提供语言
级支持,而以一种变通的方法,通过ThreadLocal的类提供支持。所以,在Java中编写线程局部变量的
代码相对来说要笨拙一些,这也是为什么线程局部变量没有在Java开发者中得到很好的普及的原因。
ThreadLocal 的接口方法
public void set(Object value):设置当前线程的线程局部变量的值
public Object get():该方法返回当前线程所对应的线程局部变量;
public void remove():将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是
JDK5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以
显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。protected Object initialValue():返回该线程局部变量的初始值,该方法是一个protected的方法,
显然是为了让子类覆盖而设计的。这个方法时一个延迟调用方法,在线程第一次调用get()或set(object)时
才执行,并且仅执行一次。ThreadLocal中的默认实现直接返回一个null。
值得一提的是,在JDK5.0中,ThreadLocal已经支持泛型,该类的类名已经变为ThreadLocal。API
方法也相应进行了调整。
ThreadLocal是如何做到为每一个线程维护一份独立的变量副本,实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的key为线程对象,而value对应线程的变量副本。
ThreadLocal与线程同步机制的比较
ThreadLocal线程同步机制都是为了解决多线程中相同变量的访问冲突问题,那么ThreadLocal与线程同步
机制相比有如下特点:
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序清楚什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。
ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal为每个线程提供了一个独立的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的对象封装,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
概括起来说,对于多线程资源共享的问题,线程同步机制采用了”以时间换空间“的方式:即访问串行化,对象共享化。而ThreadLocal采用了”以空间换时间“的方式:即访问并行化,对象独享化。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
ThreadLocal 简介的更多相关文章
- ThreadLocal 简介 案例 源码分析 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Spring学习记录6——ThreadLocal简介
Spring通过各种模板类降低了开发者使用各种数据持久化技术的难度.这些模板类是线程安全的,所以 多个DAO可以复用同一个模板实例而不会发生冲突.在使用模板类访问底层数据时,模板类需要绑定数据连接或者 ...
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- ThreadLocal学习记录
ThreadLocal简介 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的 ...
- Android 异步消息处理机制前篇(一):深入理解ThreadLocal
版权声明:本文出自汪磊的博客,转载请务必注明出处. ThreadLocal简介 ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- ThreadLocal深度解析
本文基于jdk1.8.0_66写成 0. ThreadLocal简介 ThreadLocal可以提供线程内的局部对象,合理的使用可以避免线程冲突的问题比方说SimpleDateFormat是线程不安全 ...
- java之ThreadLocal详解
一.ThreadLocal简介 ThreadLocal是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问,通常是类中的private static字段. 我们知道有时候一个对象的变量 ...
- 赌十包辣条,你一定没见过这么通透的ThreadLocal讲解
1.看个热闹 鉴于普罗大众都喜欢看热闹,咱们先来看个热闹再开工吧! 场景一: 中午了, 张三.李四和王五一起去食堂大菜吃饭.食堂刚经营不久,还很简陋,负责打菜的只有一位老阿姨. 张三:我要一份鸡腿. ...
- Java中的ThreadLocal详解
一.ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线 ...
随机推荐
- [书籍精读] 《你不知道的JavaScript(上卷)》精读笔记分享
写在前面 书籍介绍:JavaScript这门语言简单易用,很容易上手,但其语言机制复杂微妙,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也无法真正理解.本套书直面当前JavaSc ...
- 苹果Apple验证码无法发送至该电话号码。请稍后重试
前言 因为CSDN的种种作为,广告,非同意文章收费等原因,此后我的文章将转移博客园发布登陆苹果账户,输入账户登陆不发送验证码,旧手机号不用,重置了新手机号,新密码,登陆不上系统 解决1拨打苹果客服电话 ...
- 9-2 MySQL 分析查询语句:EXPLAIN(详细说明)
9-2 MySQL 分析查询语句:EXPLAIN(详细说明) @ 目录 9-2 MySQL 分析查询语句:EXPLAIN(详细说明) 1. EXPLAIN 概述 2. EXPLAIN 基本语法 3. ...
- 微信小店与微信小程序简单集成指南
微信小店现已全面打通小程序生态,为开发者提供强大的电商能力支持.本文将详细介绍各项集成功能及代码实现方案. 一.商品展示与交易能力 1. 商品卡片嵌入 // 基础商品卡片嵌入 <store-pr ...
- FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
MPEG-5是新一代的国际音视频编解码标准,像我们熟悉的MP3.MP4等音视频格式就来自于MPEG系列.MP3格式的说明介绍参见<FFmpeg开发实战:从零基础到短视频上线>一书的&qu ...
- SQL Server Management Studio (SSMS)备份数据库
在服务器上,用SQL Server Management Studio (SSMS)可以更加快速的备份数据库,备份出来的文件为bak格式. 1. 操作步骤 (1) 备份 ① 打开下面的软件 ② 选择某 ...
- Java开发笔记(一百五十三)时间戳的获取和转换
日期时间是Java一个重要的数据类型,常见的日期时间格式通常为"yyyy-MM-dd HH:mm:ss",但是计算机中存储的日期时间并非字符串形式,而是长整型的时间戳.因为字符串又 ...
- 前端开发系列114-工程化篇之Gulp构建工具的基本使用
本文主要介绍前端开发中常用的构建工具Gulp,具体包括Gulp的基本情况.安装.使用以及常见插件的安装.配置和使用等内容. Gulp介绍 Gulp是使用JavaScript编写的,运行在Node.js ...
- 通过Web ETL统一调度和管理DataX任务
DataX是一款功能强大的数据集成平台,但是其无WEB管理界面使得DataX任务在管理与调度方面存在不少问题,任务多了后很难管理和维护,同时使用和学习成本也比较高.今天就介绍下用RestCloud E ...
- 根据Word模板导出word文档,包含文本标签替换为图片,生成列表数据,以及标签替换等功能
一.前言 最近项目开发中,有一个根据word模板和指定的数据导出word文件的需求,word模板文件如下,需要将指定标签替换为数据中指定的字段,表格根据第一行的标签生成列表数据,将指定的标签替换为图片 ...