`

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应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

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

    ThreadLocal是一种在多线程环境下为每一个线程提供各自变量副本的机制,以确保线程安全。在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,...

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

    - **HTTP请求上下文**:在Web应用中,可以利用ThreadLocal传递请求相关的数据,如用户会话信息、请求参数等。 - **线程本地缓存**:为每个线程提供独立的缓存,避免并发访问引起的同步问题。 - **日志记录器**:在...

    netty中的多线程应用

    在 Netty 中,多线程的应用是其处理高并发、高性能的关键因素之一。下面我们将深入探讨 Netty 中的多线程并发应用。 1. **线程模型** Netty 采用了 Boss-Worker 线程模型,它由两部分组成:Boss 线程和 Worker ...

    ThreadLocal

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    这些实例不仅覆盖了多线程的基础应用,还涉及到高级的并发控制和同步技术,对于理解和掌握C#.NET中的多线程编程有极大的帮助。通过分析和运行这些实例,开发者可以深入理解多线程在实际项目中的运用,提升解决问题的...

    多线程线程变量赋值

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在服务器端开发和高并发应用中。当多个线程共享同一资源时,数据同步和安全问题就会变得至关重要。本话题聚焦于“多线程线程变量赋值”,讨论如何在不通过...

    java中ThreadLocal类的使用

    2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    总的来说,ThreadLocal模式在Hibernate中用于管理Session,解决了多线程环境下Session的共享问题,实现了线程间的隔离,提高了系统的稳定性和效率。通过合理地使用ThreadLocal,开发者可以构建出更高效、更安全的多...

    C# 中的 多线程 C# 多线程

    理解和掌握这些概念对于编写高效、稳定和响应迅速的多线程应用程序至关重要。在实际开发中,需要根据具体场景选择合适的线程管理策略,同时关注性能和资源的使用,以确保程序的健壮性和可维护性。

    Spring事务处理-ThreadLocal的使用

    在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...

    ThreadLocal.pdf

    在实际应用中,ThreadLocal常常与Spring框架中的事务管理一起使用,保证每个线程在事务处理过程中拥有自己独立的资源副本,而不相互干扰。 以上就是ThreadLocal的核心知识点总结。由于原始文本中的部分信息无法准确...

    设计模式及ThreadLocal资料

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。...在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一种有效手段。

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    Java并发编程中ThreadLocal的原理与应用分析

    内容概要:本文深入解析了Java中的ThreadLocal工具类,包括其常见应用场景及其原理和源码分析。通过Demo示例介绍了如何利用ThreadLocal实现线程间的隔离,使各个线程可以拥有独立的变量副本而不互相干扰。文章详细...

    使用ThreadLocal管理“session”数据

    在传统的多线程Web应用中,由于多个线程可能会处理同一个请求,如果直接在全局变量中存储session信息,可能会导致线程安全问题。而ThreadLocal提供了一个线程局部的存储空间,每个线程都有自己的ThreadLocal变量...

    JDK的ThreadLocal理解(一)使用和测试

    本文将深入探讨ThreadLocal的使用、原理以及一些实际应用中的测试案例。 ### 1. ThreadLocal的基本用法 ThreadLocal的用法非常简单,首先创建一个ThreadLocal实例,然后通过`set()`方法设置线程局部变量的值,通过...

Global site tag (gtag.js) - Google Analytics