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线程池
一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...
随机推荐
- 解决maven依赖包下载慢的问题
修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...
- asp.net 12 AJAX
Javascript:ajax Ajax:get <%@ Page Language="C#" AutoEventWireup="true" CodeBe ...
- 基于APR模式的Tomcat8环境部署
1.版本信息 组件名 版本号 jdk 1.8.111 tomcat 8.5.9 apr 1.6.3 apr-iconv 1.2.2 apr-util 1.6.2 tomcat-native 1.2.1 ...
- vue封装swiper
参考:https://github.com/surmon-china/vue-awesome-swiper npm install vue-awesome-swiper --save 全局引入 imp ...
- Java--java.util.stream.Collectors文档实例
// java.util.stream.Collectors 类的主要作用就是辅助进行各类有用的 reduction 操作,例如转变输出为 Collection,把 Stream 元素进行归组. pu ...
- im_master_search_specification
中文 http://accel-archives.intra-mart.jp/2014-winter/document/iap/public_zh_CN/im_master/im_master_sea ...
- Go语言并发机制
Go语言中的并发 使用goroutine编程 使用 go 关键字用来创建 goroutine .将go声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并 ...
- LVS (Linux虚拟服务器)-不同的负载均衡方法
随着Internet用户的增长,基于Web的公司处理的通信量急剧增加.有各种解决方案来应对这种不断增长的流量. 一种解决方案是垂直扩展服务器(即:简单地向服务器添加更多的CPU和内存资源.)当然在一定 ...
- 平衡搜索树-B树。
B Tree 系列 摘录: https://blog.csdn.net/v_JULY_v/article/details/6530142 B+树介绍 B+树的几点介绍 动态查找树有: 二叉查找树,自平 ...
- 集合(六) WeakHashMap与LinkedHashMap
5.WeakHashMap (1) 简介 WeakHashMap与HashMap几乎都是相同的,就是它的键是“弱引用”. 第一个问题:何为弱引用?即WeakReference类对象. String a ...