`

ThreadLocal的用处

阅读更多
在使用hibernate时一定都见过类ThreadLocal,这个类的具体作用是什么,今天研究了一下,有没有问题还请大家拍砖

ThreadLocal主要是针对多线程的问题而设计的,例如在一个java企业程序里,要多个线程来调用到hibernate的session,SessionFactory是线程安全的类,但是Session类并不是线程安全的,如果不对Session进行处理就会有出现多个线程相互调用而引起的混乱。而ThreadLocal的出现为我们解决了这样的一个问题。ThreadLocal会把SessionFactory生成的session存放到他里面的Map里,当有线程需要用到session时,他就会当前调用的线程分配他里面session的一个副本,从保证session本身是不会发生变化的。这样我们就可以把session放到ThreadLocal里,每个线程就只会得到当前session的一个副本,而不会得到session的本身,就是在自己的线程里把session给改变了,也不会影响到ThreadLocal里的session。这样就可以保证session的安全性。

我从百度上找到了下面这样一个程序大家可以对比看一下。

package cn.test;
/**
 *@author whp
 *@Email whp@ehoo.cn
 *@May 31, 2011
 *
 */
public class SequenceNumber {
	private static  ThreadLocal seqNum = new ThreadLocal(){//创建一个匿名内部类进行初始化
		@Override
		protected Object initialValue() {
			// TODO Auto-generated method stub
			return 0;
		}
		
	};
	
	public int getNextNum(){//得到下一个数字
		seqNum.set(((Integer) seqNum.get())+1); 
		return (Integer)seqNum.get();
	}
	
	
	public static void main(String[] args) {
		SequenceNumber sn = new SequenceNumber();
		TestClinet tc1 = new TestClinet(sn);
		tc1.start();
		TestClinet tc2 = new TestClinet(sn);
		tc2.start();
		TestClinet tc3 = new TestClinet(sn);
		
		tc3.start();
		
	}

}



package cn.test;
/**
 *@author whp
 *@Email whp@ehoo.cn
 *@May 31, 2011
 *
 */
public class TestClinet extends Thread{
	private SequenceNumber sn ;

	public TestClinet(SequenceNumber sn) {
		this.sn = sn;
	}

	@Override
	public void run() {
		for(int i=0;i<3;i++){
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("【Thread_"+Thread.currentThread().getName()+"】"+sn.getNextNum());//每个线程都会有一个新的sn。
		}
	}

}




在上面的代码中我们可以看到三个线程中session都是新的。结果如下:

【Thread_Thread-1】1
【Thread_Thread-0】1
【Thread_Thread-2】1
【Thread_Thread-1】2
【Thread_Thread-0】2
【Thread_Thread-2】2
【Thread_Thread-0】3
【Thread_Thread-2】3
【Thread_Thread-1】3
分享到:
评论

相关推荐

    JAVA并发-自问自答学ThreadLocal.pdf

    2. **ThreadLocal的主要用途**: - **状态隔离**:在多线程环境中,ThreadLocal可以用来存储线程的私有数据,如用户ID、事务ID等,确保这些数据在不同线程间互不影响。 - **简化共享对象的管理**:ThreadLocal可以...

    入研究java.lang.ThreadLocal类.docx

    **用途**:移除当前线程所持有的 ThreadLocal 变量副本,有助于减少内存占用。如果再次访问,则会重新初始化。 **示例代码**: ```java threadLocal.remove(); ``` ##### void set(T value) **用途**:设置当前...

    有关ThreadLocal的面试题你真的懂了吗

    1. ThreadLocal的用途:ThreadLocal主要用于保存线程上下文信息,在任意需要的地方可以获取。在多线程环境中,ThreadLocal可以用于避免某些情况需要考虑线程安全必须同步带来的性能损失。 2. ThreadLocal的实现原理...

    实例讲解Java并发编程之ThreadLocal类

    ThreadLocal的一个常见用途是在Servlet环境中,为每个请求维护单独的会话数据,或者在数据库连接池中为每个线程提供单独的数据库连接。这种方式避免了线程间的共享状态,简化了并发编程的复杂性,同时也提高了性能,...

    平安Java-新.doc

    11. **ThreadLocal 用途**:ThreadLocal 主要用于线程间的数据隔离,而不是数据共享。 12. **CAP 理论**:在分布式系统中,一致性、可用性和分区容错性无法同时满足,只能在三者之间做出权衡。 13. **final 方法与...

    java 中ThreadLocal本地线程和同步机制的比较

    ThreadLocal的常见用途包括: 1. 存放Session用户:每个线程可以有自己的Session副本,避免了在多线程环境下对同一个Session对象的并发访问。 2. 存放上下文变量:如WebWork的ActionContext,可以在线程内存储请求...

    JAVA面试八股文JAVA面试八股文

    - **反射机制**:了解反射的用途,如动态创建对象、修改类属性等。 - **IO/NIO**:理解输入输出流的工作原理,以及NIO(非阻塞I/O)的特性。 - **注解(Annotation)**:了解注解的定义、使用和处理方式。 在...

    Java 编程之数据结构.pdf

    然而,使用ThreadLocal时需要注意内存泄露的风险,特别是使用静态ThreadLocal变量时,更应该在业务代码结束前显式地调用remove方法来清理资源。 在返回成对结果的场景中,文档提到了使用Pair类的两种用途。第一种是...

    程序员面试中的多线程问题

    ThreadLocal类的用途与使用 `ThreadLocal`类提供了线程级别的局部变量。它为每个使用该变量的线程提供了独立的变量副本,使得每个线程修改副本时不会影响到其他线程的副本。这对于解决线程安全问题特别有用,尤其...

    适用于 Apache Tomcat 的 Redis 支持的非粘性会话存储.zip

    会话根据请求直接从 Redis 加载(但在同一请求上下文中对该会话的后续请求将返回 ThreadLocal 缓存,而不是多次访问 Redis。)为了尽可能防止冲突(和丢失写入),只有在会话被修改后,会话数据才会在 Redis 中更新...

    CoreJava资料

    6.3 ThreadLocal:了解ThreadLocal的用途,如何使用它解决线程间数据隔离的问题。 七、反射机制 7.1 反射概述:理解反射的概念,以及如何通过反射动态调用方法和访问字段。 7.2 构造器、方法和字段的反射:学习...

    基于Http协议的断点续传与Java多线程与线程的安全实践

    Java作为一种多用途的编程语言,其多线程功能强大,能够处理复杂的并发任务。然而,多线程编程中往往伴随着线程安全问题,如果不妥善处理,可能会导致程序崩溃或数据不一致。本实践主要探讨如何在Java中实现基于HTTP...

    Java 7并发编程实战手册

    1. **线程局部变量ThreadLocal**:讲解ThreadLocal类的用途及其如何帮助减少内存开销并简化代码编写。 2. **不可变对象**:解释为什么使用不可变对象可以提高并发程序的性能,并给出如何创建不可变对象的建议。 3....

    阿里云面试经验,详细记录所有面试题,分享个人面试心得

    * volatile和ThreadLocal的使用场景和原理 * synchronized和volatile的区别 * 模拟死锁场景和原子性与可见性 二、JVM相关 * JVM内存模型和GC机制 * GC的两种类型: Minor GC和Full GC * JVM里的classloader和双亲...

    阿里Java并发程序

    给线程设置名称有助于在调试和监控过程中识别线程的用途。Java中的`Thread`类提供了`setName()`方法来设定线程名称。创建线程时,可以通过构造函数传递名称,或者在创建后单独设置。 2. **响应线程中断**: 当...

    IT互联网名企经典面试题汇总:Java篇.pdf

    6. **ThreadLocal**:ThreadLocal为每个线程创建局部变量副本,提供线程安全的数据存储。 7. **聚簇索引与非聚簇索引**:聚簇索引决定了数据行在表中的物理顺序,而非聚簇索引则独立于数据行存储,通常用于快速查找...

    面试题集,包含Android、Java、数据结构、算法等.docx

    4. **ThreadLocal**:ThreadLocal为每个线程提供了独立的变量副本,避免了多线程环境下共享数据的冲突。 5. **泛型**:泛型提供编译时类型安全,允许在类、接口和方法中声明类型参数,提高了代码的复用性。 6. **...

    Web服务器的工作原理

    - **使用ThreadLocal**:通过`ThreadLocal`类来为每个线程提供独立的副本,从而避免共享资源的竞争。 综上所述,理解Web服务器、应用服务器和Web容器的概念及其之间的关系,掌握Servlet的工作原理,以及熟悉...

Global site tag (gtag.js) - Google Analytics