`
brilon
  • 浏览: 21659 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ThreadLocal的一些笔记

阅读更多
ThreadLocal最常用的场景:一个对象并非是线程安全的,但是你想让每个线程中访问的该对象是唯一的,不会和其他线程冲突,那么你就要用到ThreadLocal了。

举个简单的例子,比如SimpleDateFormat对象,不是线程安全的,假设该对象在多线程访问下会出问题,发生冲突,那么应该让每个线程只获取到唯一的该对象的实例,而且彼此线程不能访问对方的该实例。

package com.example;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormat {

	private static final ThreadLocal<SimpleDateFormat> dateFormat = 
new ThreadLocal<SimpleDateFormat>() {
		protected SimpleDateFormat initialValue() {
			return new SimpleDateFormat("yyyy-MM-dd");
		};
	};
	
	public String format(Date date){		
		return dateFormat.get().format(date);
	}
	
	public static void main(String[] args){
		DateFormat df=new DateFormat();
		System.out.println(df.format(new Date()));
	}

}


用这个简单的例子去看struts2中的ActionContext,就会理解它的用意了。tomcat对每一个request开启一个线程,然后运行Action代理,这就要求每个Action的环境变量parameters,locale等不会被其他线程访问而造成冲突。

仔细看ThreadLocal的源代码,可以发现ThreadLocal本身并不用来存储变量,只有三个静态变量:

    private final int threadLocalHashCode = nextHashCode();

    private static AtomicInteger nextHashCode = 
	new AtomicInteger();

    private static final int HASH_INCREMENT = 0x61c88647;


真正的变量存储在当前Thread里面:

    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;


ThreadLocal用作ThreadLocal.ThreadLocalMap的key,而ThreadLocal threadLocalHashCode 的作用无非就是更快的查找到ThreadLocalMap对应的Entry罢了。

举个简单的例子,就是不同的类有自己的静态ThreadLocal(初始时生成唯一threadLocalHashCode标识),通过ThreadLocal存储value时(如上个例子的SimpleDateFormat实例),实际上以ThreadLocal为key,然后和value组成entry存储在当前线程的ThreadLocal.ThreadLocalMap threadLocals中。各自的类在调用value时,会首先在当前线程中以ThreadLocal为key进行查找(没有找到则调用initialValue()创建)。

线程类Thread负责线程的运行和线程变量的存储,而ThreadLocal则是负责变量的管理,各司其职。

分享到:
评论

相关推荐

    优雅的使用 ThreadLocal

    来源:码匠笔记前言 在我们日常 Web 开发中难免遇到需要把一个参数层层的传递到最内层,然后中间层根本不需要使用这个参数,或者是仅仅在特定的工具类中使用,这样我们完全没有必要在每一个方法里面都传递这样一个 ...

    Java并发编程学习笔记

    3、ThreadLocal 的底层实现与使用 4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层实现原理 7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    java8源码-ac_babel:一些后端学习笔记整理

    java8 源码 设计模式 java 并发 public class Foo { // SimpleDateFormat is not thread-safe, so ...ThreadLocal ...ThreadLocal(){ ...ThreadLocal&lt;Map&gt;&gt; ...ThreadLocal.withInitial(HashMap::new); public

    Java多线程源码笔记.pdf

    1.什么是多线程 2.Thread类解析 3.使用多线程需要注意的问题 4.synchronized锁和lock锁 5.AQS 6.ReentrantLock和ReentrantReadWriteLock 7.线程池 8.死锁 9.线程常用的工具栏 10.Atomic 11.ThreadLocal

    并发编程笔记20190526.docx

    2. ThreadLocal辨析 11 3. 线程间的协作 19 4. 面试题 21 第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

    百度地图开发java源码-MD-Notes:计组、操作系统、数据结构、网络IO、Redis、MySQL、JVM等笔记

    百度地图开发java源码 MD-Notes:后端笔记总结 关于 MD-Notes: 业余时间学习技术的同时,做一些记录和总结并乐于分享。...:线程状态,ThreadLocal,强软弱虚引用,自定义线程池 :类加载过程,双亲委派机制 :syncro

    java8源码-note:笔记

    笔记 1.Java基础 1.1 关于随机数的生成 1.2 ArrayList clear() 与 removeAll 的实现 1.3 包装类型 1.4 关于JVM 1.5 泛型 1.6 锁 1.7 浮点数 1.8 ArrayList.toArray() 1.9 String 1.10 HTTP 1.11 HashMap 2.进阶 2.1 ...

    Java并发编程(学习笔记).xmind

    ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    java并发学习笔记

    文章目录1 线程基础、线程之间的共享与协作1.1 cpu时间片轮询机制1.2 ...ThreadLocal1.11 wait()、notify()和notifyAll()方法1.11.1 锁池和等待池1.11.2 wait()方法1.11.3 notify()和notifyAll()方法1.11.4 wait()和...

    JDK_seaswalker.tar.gz

    JDK源码阅读笔记 Condition CountDownLatch CyclicBarrier ReadWriteLock ReentrantLock Socket UDP IO FileChannel Buffer URLConnection NIO Process HashMap LinkedHashMap TreeMap ...

    day020-继承加强和设计模式代码和笔记.rar

    1. 单元测试:(掌握) 1. 写一个单元测试类,命名方式:XxxTest(测试类没有...6. ThreadLocal类 (掌握简单使用): 解决了线程安全问题,通过线程隔离有安全问题的数据实现的,底层是通过map保存线程id和值的。

    leetcode下载-newbie-notes:编码记录

    创建该项目是为了记录自己的一些笔记 希望把jdk常用包使用记录一下,并结合一些常规的工作场景进行探讨,便于以后当工具/模板库使用 synchronized 同步关键字 volatile 关键字 AQS 框架 ReentrantLock 可重入锁 ...

    互联网创意产品众筹平台

    │ ├─笔记, ^% P) P8 t. Y/ u n/ s8 [; l │ └─视频4 ]: q1 d9 i$ { c8 |* v │ 01-线程安全问题概述 │ 02-ThreadLocal解决线程资源共享 │ 03-弹层组件layer使用. [- l; o" [6 F# U# ~. a7 c │ 04-用户分页...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 AbstractStringBuilder 1 StringBuffer 1 StringBuilder 1 Boolean 2 Byte...

    HongsCORE:洪的通用对象请求引擎

    HongsCORE framework for Java文档版本: 19.01.12软件版本: 1.0.2-20201212设计作者: 黄弘(Hongs)技术支持:HongsCORE 即 Hong's Common Object Requesting ... 具体到这个 Java 版本中, 利用 ThreadLocal 以及 Tom

    Android Handler机制的工作原理详析

    上一次写完Binder学习笔记之后,再去看一遍Activity的启动流程,因为了解了Binder的基本原理,这次看印象会更深一点,学习效果也比以前好很多。本来打算直接来写Activity的启动流程的,但总觉得Handler也需要写一下...

Global site tag (gtag.js) - Google Analytics