`

ThreadLocal在多线程中的应用

    博客分类:
  • Java
 
阅读更多

 

本例充分演示了ThreadLocal在多线程环境下,与线程绑定后的数据操作是完全隔离的!

放心使用ThreadLocal吧!千万记得用完之后要remove!

 

 

package thread;

import java.util.Date;
import java.util.Random;

/**
 * 线程范围内的变量,每个线程都有自己的一份数据,换不干扰
 * 
 * 原理:
 * ThreadLocal类中通过Map<Thread.currentThread(), Object>实现数据与线程绑定的!
 * Map的key就是线程自己,所以每个线程都能拿到属于自己的那份数据
 * 
 */
public class ThreadLocalScopeData {
	
	private static ThreadLocal<TreadLocalScopeData> threadLocal = new ThreadLocal<TreadLocalScopeData>();
	
	private ThreadLocalScopeData() {}
	
	//此方法不需要同步
	public static TreadLocalScopeData getThreadLocalBinding() {
		TreadLocalScopeData instance = threadLocal.get();
		if(instance==null) {
			instance = new TreadLocalScopeData();
			threadLocal.set(instance);
		}
		return instance;
	}
	
	//=============================================
	
	Object data1;
	
	Object data2;
	
	// define  more data binding to thread 
	
	public TreadLocalScopeData data1(Object data1) {
		this.data1 = data1;
		return this;
	}
	
	public TreadLocalScopeData data2(Object data2) {
		this.data2 = data2;
		return this;
	}
	
	//finally remove threadLocal variable
	public void remove() {
		threadLocal.remove();
	}
	
	//**************************************************
	//Test
	public static void main(String[] args) {
		for(int i=0;i<10;i++) {
			new Thread(new Runnable() {
				public void run() {
					ThreadLocalScopeData.justSet();
					ThreadLocalScopeData.justGet("before remove");

					//attempt to visit threadLocal data after removed
					TreadLocalScopeData.getThreadLocalBinding().remove();
					TreadLocalScopeData.justGet("after remove");
				}
			}).start();
		}
		
	}
	
	public static void justSet() {
		TreadLocalScopeData treadLocalScopeData = TreadLocalScopeData.getThreadLocalBinding();
		String data1Val = new Date() +", so easy!";
		int data2Val = new Random().nextInt();
		System.out.println(Thread.currentThread().getName()+" set: " + data1Val + ", " + data2Val);
		treadLocalScopeData.data1(data1Val).data2(data2Val);
		try {
			Thread.sleep(new Random().nextInt(100));
		} catch (InterruptedException e) {
			return;
		}
	}
	
	public static void justGet(String when) {
		TreadLocalScopeData treadLocalScopeData = TreadLocalScopeData.getThreadLocalBinding();
		System.out.println(Thread.currentThread().getName()+" get "+ when +":" + treadLocalScopeData.data1 + ", " + treadLocalScopeData.data2);
		try {
			Thread.sleep(new Random().nextInt(100));
		} catch (InterruptedException e) {
			return;
		}
	}
}

 

 

分享到:
评论

相关推荐

    ThreadLocal原理及在多层架构中的应用.pdf

    ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。

    ThreadLocal

    应用ThreadLocal进行多线程处理,经典小例子。可运行。

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    Java多线程编程之ThreadLocal线程范围内的共享变量

    主要介绍了Java多线程编程之ThreadLocal线程范围内的共享变量,本文讲解了ThreadLocal的作用和目的、ThreadLocal的应用场景、ThreadLocal的使用实例等,需要的朋友可以参考下

    Java高级程序设计-多线程(二).pptx

    本章内容 掌握同步代码块的使用 掌握同步方法的使用 理解线程死锁 掌握 ThreadLocal 类的使用 使用多线程模拟猴子采花 使用同步方法模拟购票 使用多线程模拟购物订单生成 使用 ThreadLocal 类模拟银行取款 Java高级...

    对ThreadLocal的理解【源码分析+应用举例】

    当多线程操作这个变量时,实际操作的就是自己本地内存里面的变量,从而在一定程度上避免了线程安全问题。但是使用ThreadLocal对象去存储一个共享资源时,每一个线程的副本变量都指向同一个共享资源,这里也是会存在...

    Java并发编程相关技术使用案例

    线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的应用、Completablefuture的应用、手写阻塞队列、fork...

    Mybatis PageHelper分页插件是一个应用于Mybatis中的分页插件系统.rar

    `在mysql中,分页的sql是使用limit来做的。...PageHelper会在mybatis执行sql前进行拦截,从ThreadLocal中取出分页参数,修改当前执行的sql语句,添加分页sql,最后执行了添加了分页的sql语句,实现分页查询

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

    13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析...

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

    13.6 实际应用中的任务调度 13.6.1 如何产生任务 13.6.2 任务调度对应用程序集群的影响 13.6.3 任务调度云 13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    并发编程笔记20190526.docx

    4. 多线程程序需要注意事项 6 二、认识Java里的线程 7 1. Java程序天生就是多线程的 7 2. 线程的启动与中止 7 3. 对Java里的线程再多一点点认识 8 三、线程间的共享和协作 9 1. 线程间的共享 9 2. ThreadLocal辨析 ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    180多页面试题,前前后后不间断的更新了两年,准备换工作时,总是拿来看看,有比较好的面试题,也不间断的更新,面试题目录如下: 【基础】面向对象的特征有哪些方面 13 ...4、ZooKeeper在大型分布式系统中的应用 189

    Java并发编程实战

    4.4 在现有的线程安全类中添加功能 4.4.1 客户端加锁机制 4.4.2 组合 4.5 将同步策略文档化 第5章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 5.1.2 迭代器与Concurrent-ModificationException ...

    Java 并发编程实战

    4.4 在现有的线程安全类中添加功能 4.4.1 客户端加锁机制 4.4.2 组合 4.5 将同步策略文档化 第5章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 5.1.2 迭代器与Concurrent-ModificationException ...

    Java并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    Sundial:轻量级作业计划框架

    晷Java的轻量级作业计划框架。简而言之Sundial使您可以在公园里散步,将预定的作业添加到Java应用程序中。...特征 Apache 2.0许可证 〜150 KB罐 内存中多线程作业 在Jobs.xml中定义作业和触发器 或通过注释定义作业

Global site tag (gtag.js) - Google Analytics