ThreadLocal源代码1
public class ThreadLocalTrxt {
static ThreadLocal<Object> x1 = new ThreadLocal<Object>();
static ThreadLocal<Object> x2 = new ThreadLocal<Object>();
static ThreadLocal<Object> x3 = new ThreadLocal<Object>();
static ThreadLocal<Object> x4 = new ThreadLocal<Object>();
static ThreadLocal<Object> x5 = new ThreadLocal<Object>(); public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i<5; i++) {
x1.set(i); //把x1设置到这个线程的threadLocals里面的table里面的Entry里面的referent里面去,还有i=0
x2.set(i);
x3.set(i);
x4.set(i);
x5.set(i);
}
Thread t = Thread.currentThread();
ThreadLocal<Object> x6 = new ThreadLocal<Object>();
x6.remove();
x1.remove();
x2.remove();
x3.remove();
x4.remove();
x5.remove();
}
}).start();
}
}
}
public class Test { public static void main(String[] args) {
AtomicInteger hashCode = new AtomicInteger();
int hash_increment = 0x61c88647;
int size = 32;
List <Integer> list = new ArrayList <> ();
for (int i = 0; i < size; i++) {
System.out.println(hashCode);
hashCode.getAndAdd(hash_increment);
System.out.println(hashCode);
System.out.println(hashCode.intValue() & (size - 1));
list.add(hashCode.intValue() & (size - 1));
}
System.out.println("original:" + list);
Collections.sort(list);
System.out.println("sort: " + list);
System.out.println(hash_increment);
}
}
public class ThreadLocalTrxt {
static ThreadLocal<Integer> x = 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 s = new Random().nextInt();
x.set(s); // ThreadLocal 设置值的时候,自动跟线程关联
System.out.println(x.get()); // ThreadLocal 取值的时候,自动跟线程关联
}
}).start();
}
}
}
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t); // 返回null
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
threadLocals是ThreadLocalMap在线程Thread里面
ThreadLocalMap getMap(Thread t) {
return t.threadLocals; // 返回线程的threadLocals,是一个ThreadLocalMap类型,只不过这个类型在ThreadLocal里面定义
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue); //this是ThreadLocal,调用x.set(s);的x
} public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
ThreadLocal设置值是设置到这个线程的threadLocals属性里面去了,并且ThreadLocal自己也在threadLocals里面。多个线程共用这个ThreadLocal。
ThreadLocalMap的key是ThreadLocal,Value是set方法设置进来的值。
Entry是ThreadLocalMap的内部类,ThreadLocal和value2个属性组成。
线程初始化时候:
public class ThreadLocalTrxt {
static ThreadLocal<Object> x1 = new ThreadLocal<Object>();
static ThreadLocal<Object> x2 = new ThreadLocal<Object>();
static ThreadLocal<Object> x3 = new ThreadLocal<Object>();
static ThreadLocal<Object> x4 = new ThreadLocal<Object>();
static ThreadLocal<Object> x5 = new ThreadLocal<Object>();
static ThreadLocal<Object> x6 = new ThreadLocal<Object>(); public static void main(String[] args) {
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {//2个线程调用,则2个线程共享x1,x2,x3,x4,x5,x6。但是ThreadLocal里面没有属性(只是充当一个key),2个线程修改的时候,
//修改的是线程内部的threadLocals。Thread和ThreadLocal是在一个包下的。不同线程相同的key(ThreadLocal)得到的可以是不同的value。
@Override
public void run() {
for(int i = 0; i<5; i++) {
x1.set(i); //把x1设置到这个线程的threadLocals里面的table里面的Entry里面的referent里面去,还有i=0
x2.set(i); // 重复调用会覆盖
x3.set(i);
x4.set(i);
x5.set(i);
x6.set(i);
}
Thread t = Thread.currentThread();
System.out.println(x1.get());
x1.remove();
}
}).start();
}
}
}
ThreadLocal无法解决线程安全问题。也就是说ThreadLocal是被各个线程共享的。
ThreadLocal源代码1的更多相关文章
- Java ThreadLocal 源代码分析
Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...
- 多线程之美2一ThreadLocal源代码分析
目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3. ...
- ThreadLocal源代码3
public class ThreadLocal1<T> { //当创建了一个 ThreadLocal 的实例后,它的散列值就已经确定了, //threadLocal实例的hashCode ...
- ThreadLocal源代码2
private static int nextIndex(int i, int len) { return ((i + 1 < len) ? i + 1 : 0); } private stat ...
- 另一鲜为人知的单例写法-ThreadLocal
另一鲜为人知的单例写法-ThreadLocal 源代码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们寻经常使用双重检查锁非常不一样.而是用来一个T ...
- java ThreadLocal(应用场景及使用方式及原理)
尽管ThreadLocal与并发问题相关,可是很多程序猿只将它作为一种用于"方便传參"的工具,胖哥觉得这或许并非ThreadLocal设计的目的,它本身是为线程安全和某些特定场景的 ...
- ThreadLocal分析
我们再介绍一个在多线程环境中经常使用的类ThreadLocal,它是java为解决多线程程序的并发问题提供了一种新的方向,使用这个ThreadLocal类可以帮助开发者很简单地编写出简洁的程序,并且是 ...
- ThreadLocal深入理解与内存泄露分析
ThreadLocal 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本.所以每个线程都能够独立地改变自己的副本.而不会影响其他线程所相应的副本. ...
- 深入理解线程本地变量ThreadLocal
ThreadLocal理解: 假设在多线程并发环境中.一个可变对象涉及到共享与竞争,那么该可变对象就一定会涉及到线程间同步操作,这是多线程并发问题. 否则该可变对象将作为线程私有对象,可通过Threa ...
随机推荐
- 基于TCP和UDP的Socket通信
TCP的Socket通信 TCP是面向连接的,安全的协议,它是一对一的关系 server client 上面只是单个客户端同服务器通信,可使用多线程编程实现多个客户端的通信 UDP的Socket通信 ...
- self & _cmd
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles ...
- 浏览器正在等待locatehost的响应
1.问题描述 在进行了几次增删改查操作后,浏览器显示浏览器正在等待locatehost的响应: 2.错误原因: 对数据库为关闭相应的资源. 3.解决方案: 关闭JDBC开启的资源:
- 【BigData】Java基础_冒泡排序
1.实现需求 根据已经存在的数组,使用冒泡排序将数组中的元素排序后输出. 2.代码 package cn.test.logan.day02; /** * 冒泡排序在数组上的实现 * @author Q ...
- nginx php-fpm 配置问题(1)
nginx php-fpm 配置问题(1) 1.问题 Nginx/FPM/PHP all php files say 'File not found.' nginx error日志: [erro ...
- UDF——计算壁面边界合力矩(旋转机械)
- Spring Cloud Zuul 概览
什么是API网关 网关这个词其实是一个硬件概念.因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起.在家庭网络 和小型企业中,宽带路由器通常充当网络网关.它将 ...
- Anaconda更新失败简单解决[CondaHTTPError: HTTP 000 CONNECTION FAILED for url]
问题:conda无法安装更新,报错内容如下:参考链接:conda httperror http none none for url none Anaconda更新失败 conda create -n ...
- RocketMQ安装部署
一.简介RocketMQ RocektMQ是阿里巴巴在2012年开源的一个纯java.分布式.队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的 ...
- Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项。系统找不到指定的文件。
ylbtech-Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项.系统找不到指定的文件. 1.返回顶部 1. “/”应用程序中的服务器错误. 分析器错误 说 ...