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线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
随机推荐
- 题解 UVA1316 【Supermarket】
题目链接: https://www.luogu.org/problemnew/show/UVA1316 思路: 根据题目意思,我们需要用到贪心的思想,越晚过期的商品当然是越晚卖好.同时你假如有多个商品 ...
- Java对象的序列化和反序列化介绍
一.什么序列化和反序列化以及作用: java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程 1.序列化: 1)对象序列化的最主要的用处就是在传递 ...
- 前端配置jenkins
tar命令详解:https://www.cnblogs.com/luck123/p/11401007.html
- shiro权限控制配置
shiro配置流程 web.xml中配置shiro的filter spring中配置shiro的过滤器工厂,指定对不同地址权限控制 , 传入安全管理器 配置安全管理器,传入realm,realm中定义 ...
- rabbitmq 连接报错 An unexpected connection driver error occured
转自:https://blog.csdn.net/zht741322694/article/details/82801873 在服务器上安装了一个RabbitMq,并新创建了一个用户授予了管理员角色, ...
- MySql学习笔记【三、表相关操作】
创建表 CREATE TABLE [IF NOT EXISTS] table_name( column_name data_type, ... ) 如: CREATE TABLE test_table ...
- beego注解路由不刷新(不生效)
本文主要说明本人在使用beego的注解路由时不生效问题 背景: 1.按照官网进行注解路由配置,第一次设置路由,完全正确,注解路由可用. 2.修改路由注释后,发现swagger页面并未有对应的更新 3. ...
- Oracle笔记(七) 数据更新、事务处理、数据伪列
一.数据的更新操作 DML操作语法之中,除了查询之外还有数据的库的更新操作,数据的更新操作主要指的是:增加.修改.删除数据,但是考虑到emp表以后还要继续使用,所以下面先将emp表复制一份,输入如下指 ...
- Linux系统组成和获取命令帮助4
Linux文件系统: 1.文件名名称严格区分字符大小写 2.文件可以使用除/以外任意字符 3.文件名长度不能超过255字符 4.以.开头的文件为 ...
- Selenium3-浏览器与驱动对照
在学selenium自动化测试时,遇到的第一个大问题便是浏览器版本.浏览器驱动版本与selenium的版本不对应,而无法驱动浏览器进行自动化操作. 收集了网上的一些技术文档,决定也整理一份相对较全面的 ...
