`

实战十二:threadlocal 使用

 
阅读更多

 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。我们自己就可以提供一个简单的实现版本

 

 

public class TestThreadLocal {

 

ThreadLocal<String> myLocal = new ThreadLocal<String>();

 

String myName;

 

public String getName() {

return myName;

}

 

public void setName(String name) {

myName = name;

}

 

public static void main(String[] args) throws InterruptedException {

TestThreadLocal ooo = new TestThreadLocal();

Thread[] threadArray = new Thread[10];

for (int i = 0; i < 10; i++) {

 

Thread thi = new Thread(new ThreadWithoutThreadLocal(ooo), "thread" + i);

threadArray[i] = thi;

}

 

for (Thread th : threadArray) {

th.start();

}

 

Thread.sleep(3000);

System.out.println("-----------------------------------------------------------------");

 

for (int i = 0; i < 10; i++) {

 

Thread thi = new Thread(new ThreadWithThreadLocal(ooo), "thread" + i);

threadArray[i] = thi;

}

 

for (Thread th : threadArray) {

th.start();

}

}

 

}

 

class ThreadWithoutThreadLocal implements Runnable {

public TestThreadLocal ooo;

 

public ThreadWithoutThreadLocal(TestThreadLocal o) {

ooo = o;

}

 

@Override

public void run() {

String localName = Thread.currentThread().getName();

ooo.setName(localName);

ooo.myLocal.set(localName);

// it will be mess up if multi thread running

// result like this

// ThreadName =======thread1 but it's actual name thread1

// ThreadName =======thread2 but it's actual name thread2

// ThreadName =======thread1 but it's actual name thread0

// ThreadName =======thread4 but it's actual name thread4

// ThreadName =======thread3 but it's actual name thread3

// ThreadName =======thread7 but it's actual name thread7

// ThreadName =======thread6 but it's actual name thread6

// ThreadName =======thread5 but it's actual name thread5

// ThreadName =======thread8 but it's actual name thread8

// ThreadName =======thread9 but it's actual name thread9

System.out.println(

"ThreadName =======" + ooo.getName() + " but it's actual name  " + Thread.currentThread().getName());

 

}

 

}

 

class ThreadWithThreadLocal implements Runnable {

public TestThreadLocal ooo;

 

public ThreadWithThreadLocal(TestThreadLocal o) {

ooo = o;

}

 

@Override

public void run() {

String localName = Thread.currentThread().getName();

ooo.myLocal.set(Thread.currentThread().getName());

 

// ThreadName======thread0 but it's actual name thread0

// ThreadName======thread2 but it's actual name thread2

// ThreadName======thread1 but it's actual name thread1

// ThreadName======thread3 but it's actual name thread3

// ThreadName======thread5 but it's actual name thread5

// ThreadName======thread4 but it's actual name thread4

// ThreadName======thread8 but it's actual name thread8

// ThreadName======thread6 but it's actual name thread6

// ThreadName======thread9 but it's actual name thread9

// ThreadName======thread7 but it's actual name thread7

 

System.out.println("ThreadName======" + ooo.myLocal.get() + " but it's actual name  " + localName);

 

}

 

 

}

分享到:
评论

相关推荐

    ThreadLocal简单Demo

    ThreadLocalMap是ThreadLocal类中的内部类,实例却被Thread类持有,相当于每个线程持有一个map

    龙果 java并发编程原理实战

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    3.1多线程的团队协作:同步控制 3.2线程复用:线程池 3.3不要重复发明轮子:jdk的并发容器 3.4使用jmh进行性能测试 3.2线程复用:线程池 3.3不要重复发明轮子:JDK的并发容器 3.4使用JMH进行性能测试 实战Java高并发...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

    Java 并发编程原理与实战视频

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    Java ThreadLocal类应用实战案例分析

    主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下

    Java并发编程实战

    3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...

    基于SpringBoot+Mybatis+Redis开发的一个问答社区源码+sql数据库(仿牛客网).zip

    使用 ThreadLocal 保存用户状态,通过拦截器拦截请求,根据自定义注解判断用户登录状态 使用 Ajax 异步发帖、发送私信、评论 使用 Redis 实现点赞、关注功能,优化登录模块——存储登录凭证、缓存用户信息 【备注】 ...

    龙果java并发编程完整视频

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    java并发编程

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    Java 并发编程实战

    3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    Spring3.x企业应用开发实战(完整版) part1

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    Spring.3.x企业应用开发实战(完整版).part2

    《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...

    廖雪峰python3 完整带索引,图片 最新教程 pdf版

    ThreadLocal 进程 vs. 线程 分布式进程 正则表达式 常用内建模块 datetime collections base64 struct hashlib hmac itertools contextlib urllib XML HTMLParser 常用第三方模块 Pillow requests chardet psutil ...

    并发:高并发编程学习与实战

    同时高并发编程学习与实战,系统的学习并发编程的知识。目录结构atomic:原子类container:同步容器与并发容器不可变:发布:对象的发布sync:线程同步threadLocal:螺纹封闭unsafe-class:常用的线程不安全类

    Java并发编程实战(中文版).pdf java多线开发

    1.互斥条件:一个资源每次只能被一个进程使用。 2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 4.循环等待条件:若干...

Global site tag (gtag.js) - Google Analytics