java多线程系列17 ThreadLocal
ThreadLocal 叫做 线程局部变量
在详细解释之前 先看一段代码
public class ThreadLocalTest {
private static ThreadLocal<Integer> intThreadLocal = new ThreadLocal<Integer>();
public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int data = new Random().nextInt(10000);
System.out.println(Thread.currentThread().getName() + " add data :" + data);
intThreadLocal.set(data);
System.out.println(Thread.currentThread().getName() + " " + intThreadLocal.get());
}
}).start();
}
}
运行结果如下

可以看到每个Thread都是自己设置进去的那个值,相互不影响
ThreadLocal有两个比较重要的方法
get() set()
下面我们细看一下 get()
public T get() {
//获取当前线程
Thread t = Thread.currentThread();
//获取到当前线程的ThreadLocalMap对象,每个线程都有一个
ThreadLocalMap map = getMap(t);
if (map != null) { //不为空 就把ThreadLocal作为key 获取对应的值
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue(); //为空 就初始化
}
下面我们细看一下 set()
//map不为空 将值设置进线程的 ThreadLocal中。为空就new一个
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
总结:
1 ThreadLocal 不是用来解决共享对象的多线程访问问题的,
一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象(新new出来的对象),其他线程是不需要访问的,也访问不到的。
倘若都设置的同一个对象 依然会有线程安全问题。
2 若多个线程之间需要共享资源,以达到线程间的通信时,就使用同步机制;若仅仅需要隔离多线程之间的关系资源,则可以使用ThreadLocal。
java多线程系列17 ThreadLocal的更多相关文章
- java多线程系列 目录
Java多线程系列1 线程创建以及状态切换 Java多线程系列2 线程常见方法介绍 Java多线程系列3 synchronized 关键词 Java多线程系列4 线程交互(wait和 ...
- Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...
- Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock
概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...
- Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap
概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
- Java多线程系列
一.参考文献 1.:Java多线程系列目录 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 03. ...
- java多线程系列(三)---等待通知机制
等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解 ...
- Java多线程系列——从菜鸟到入门
持续更新系列. 参考自Java多线程系列目录(共43篇).<Java并发编程实战>.<实战Java高并发程序设计>.<Java并发编程的艺术>. 基础 Java多线 ...
- Java多线程系列目录(转)
转载方便自己学习,转自:Java多线程系列目录(共43篇) http://www.cnblogs.com/skywang12345/p/java_threads_category.html 最近,在研 ...
随机推荐
- java多线程中最佳的实践方案是什么?
java多线程中最佳的实践方案是什么? 给你的线程起个有意义的名字.这样可以方便找bug或追踪.OrderProcessor, QuoteProcessor or TradeProcessor 这种名 ...
- jquery中ajax使用error调试错误的方法
JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息. jquery ...
- kubernetes之configmap,深度解析mountPath,subPath,key,path的关系和作用
参考:https://www.cnblogs.com/breezey/p/6582082.html 我们知道,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如说在web的程序中,需要连接数据库, ...
- leetcode136
public class Solution { public int SingleNumber(int[] nums) { Dictionary<int, int> dic = new D ...
- c#读取文本并生成txt
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ajax用FormData方式提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CSS 盒子投影
box-shadow 属性可以设置盒子的投影效果.它的原理同文本投影一样.字体风格一节有介绍. 它有4个值,同时使用,也可以有选择地使用: 第一个值 设置阴影左右延伸长度,负值向左,正值向右 第二个值 ...
- python入门(八):文件操作
1.数据的保存: 1) 内存:常用的变量都是在内存里面的 缺点:关机或进程死掉数据丢失 解决方法:将数据保存至文件中 2 )文件:文本内容.二进制的文件内容 3 )数据库:保存 2.读文件: 1 ...
- 使用pandas进行数据预处理01
数据预处理有四种技术:数据合并,数据清洗,数据标准化,以及数据转换. 数据合并技术:(1)横向或纵向堆叠合数据 (2)主键合并数据 (3)重叠合并数据 1.堆叠合并数据: 堆叠就是简单的把两个表拼接在 ...
- ubuntu安装jdk,maven,tomcat
ubuntu16.04安装jdk8 -jdk 检查是否安装成功 java -version 出现如上信息即安装成功 安装maven,先去官网下载指定版本的maven,个人使用apache-maven- ...