Java线程之ThreadLocal
简述
ThreadLocal类用来提供线程内部的局部变量,这种变量在多线程环境下通过get或set方法访问,它能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一线程内多个方法间一些公共变量的传递的复杂性。
##事例
这里有一个小示例,展示了java程序中ThreadLocal的使用,并证明每个线程都有自己的ThreadLocal变量副本
package com.lkf.mulithread;
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable{
// SimpleDateFormat不是线程安全的,所以每个对象引用一个
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
public static void main(String[] args) throws InterruptedException {
ThreadLocalExample threadLocalExample = new ThreadLocalExample();
for(int i=0 ; i<10; i++){
Thread t = new Thread(threadLocalExample, "Thread"+i);
Thread.sleep(new Random().nextInt(1000));
t.start();
}
}
@Override
public void run() {
System.out.println("线程: "+Thread.currentThread().getName()+" 默认时间格式: "+formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//时间格式在此更改,但是不会影响到其它线程
formatter.set(new SimpleDateFormat());
System.out.println("线程 "+Thread.currentThread().getName()+" 时间格式:"+formatter.get().toPattern());
}
}
输出结果:
线程:Thread0 默认时间格式: yyyyMMdd HHmm
线程:Thread1 默认时间格式: yyyyMMdd HHmm
线程:Thread2 默认时间格式: yyyyMMdd HHmm
线程:Thread1 时间格式:yy-M-d ah:mm
线程:Thread0 时间格式:yy-M-d ah:mm
线程:Thread3 默认时间格式: yyyyMMdd HHmm
线程:Thread2 时间格式:yy-M-d ah:mm
线程:Thread3 时间格式:yy-M-d ah:mm
线程:Thread4 默认时间格式: yyyyMMdd HHmm
线程:Thread4 时间格式:yy-M-d ah:mm
线程:Thread5 默认时间格式: yyyyMMdd HHmm
线程:Thread5 时间格式:yy-M-d ah:mm
线程:Thread6 默认时间格式: yyyyMMdd HHmm
线程:Thread6 时间格式:yy-M-d ah:mm
线程:Thread7 默认时间格式: yyyyMMdd HHmm
线程:Thread7 时间格式:yy-M-d ah:mm
线程:Thread8 默认时间格式: yyyyMMdd HHmm
线程:Thread9 默认时间格式: yyyyMMdd HHmm
线程:Thread8 时间格式:yy-M-d ah:mm
线程:Thread9 时间格式:yy-M-d ah:mm
从输出结果中看,线程1中修改了时间格式,但是线程2中的初始化格式与线程1一样,并没有受到影响,其它线程也如此
更新
ThreadLocal功能在Java8中得到增强,添加了一个新方法withInitial(),我们可以使用lambda表达式简单的创建ThreadLocal实例,如下:
private static final ThreadLocal<SimpleDateFormat> formatter =
ThreadLocal.withInitial
(() -> new SimpleDateFormat("yyyyMMdd HHmm"));
Java线程之ThreadLocal的更多相关文章
- Java线程之 InterruptedException 异常
Java线程之 InterruptedException 异常 当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...
- java多线程之ThreadLocal
ThreadLocal为每个线程保存变量,以保证数据同步. package Thread.Common; import java.util.Random; import java.util.concu ...
- Java多线程之ThreadLocal总结2
ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- Java多线程之ThreadLocal总结
原贴地址:http://www.cnblogs.com/zhengbin/p/5674638.html 阅读目录 官方对ThreadLocal的描述: <Thinking in Java> ...
- java基础---->多线程之ThreadLocal(七)
这里学习一下java多线程中的关于ThreadLocal的用法.人时已尽,人世还长,我在中间,应该休息. ThreadLocal的简单实例 一.ThreadLocal的简单使用 package com ...
- 多线程之ThreadLocal类
深入研究java.lang.ThreadLocal类 0.前言 ThreadLocal(线程变量副本)Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量.采用空间换 ...
- 多线程之ThreadLocal(转)
相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资源时的 ...
- 多线程之ThreadLocal
Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLoc ...
- java 线程之executors线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
随机推荐
- hdu 6025(女生赛)
典型的用空间换取时间的思想 关键要理解多个数怎么算最小公倍数 用一个前缀 一个后缀 然后枚举去掉的点就可以了 #include <iostream> #include <cstdio ...
- windows环境下,kafka常用命令
创建topics kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partition 3 - ...
- 第十五章、Python多线程之信号量和GIL
目录 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用 ...
- innodb存储引擎之内存
1.innoDB存储引擎体系架构 如上图所示,innoDB存储是基于磁盘存储的,并且其中的记录以页的方式进行管理,但为什么要引入一个内存池呢? 其目的就是为了协调CUP速度与磁盘速度的鸿沟,基于磁盘的 ...
- NETGEAR 系列路由器命令执行漏洞简析
NETGEAR 系列路由器命令执行漏洞简析 2016年12月7日,国外网站exploit-db上爆出一个关于NETGEAR R7000路由器的命令注入漏洞.一时间,各路人马开始忙碌起来.厂商忙于声明和 ...
- 《python解释器源码剖析》第6章--python中的dict对象
6.0 序 元素和元素之间可能存在着某种关系,比如学生姓名和成绩.我希望能够通过学生的姓名找到这个学生的成绩,那么只需要将两者关联起来即可.字典正是这么做的,字典中的每个元素就是一个key:value ...
- GMT、UTC、UNIX时间戳、时区
GMT.UTC.CTS: UTC时间:世界协调时间(UTC)是世界上不同国家用来调节时钟和时间的主要时间标准,也就是零时区的时间.UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统 ...
- QTP(13)
练习1:Flight4a 要求: a.录制Flight4a登录+购票+退出业务流程 b.实现登录1次,购票3次,退出1次 c.对Fly From.Fly to.航班实现随机参数化 随机参数化:Rand ...
- okhttp框架源码分析从同步&异步请求使用开始
对于okhttp在如今项目中的普及程度已经不言而喻啦,基本上如今网络请求都会基于它去进行封装,而非前几年用Android的网络框架HttpURLConnection和Apache HttpClient ...
- 201271050130-滕江南-《面向对象程序设计(java)》第十七周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十七周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...