在使用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
分享到:
相关推荐
2. **ThreadLocal的主要用途**: - **状态隔离**:在多线程环境中,ThreadLocal可以用来存储线程的私有数据,如用户ID、事务ID等,确保这些数据在不同线程间互不影响。 - **简化共享对象的管理**:ThreadLocal可以...
**用途**:移除当前线程所持有的 ThreadLocal 变量副本,有助于减少内存占用。如果再次访问,则会重新初始化。 **示例代码**: ```java threadLocal.remove(); ``` ##### void set(T value) **用途**:设置当前...
1. ThreadLocal的用途:ThreadLocal主要用于保存线程上下文信息,在任意需要的地方可以获取。在多线程环境中,ThreadLocal可以用于避免某些情况需要考虑线程安全必须同步带来的性能损失。 2. ThreadLocal的实现原理...
ThreadLocal的一个常见用途是在Servlet环境中,为每个请求维护单独的会话数据,或者在数据库连接池中为每个线程提供单独的数据库连接。这种方式避免了线程间的共享状态,简化了并发编程的复杂性,同时也提高了性能,...
11. **ThreadLocal 用途**:ThreadLocal 主要用于线程间的数据隔离,而不是数据共享。 12. **CAP 理论**:在分布式系统中,一致性、可用性和分区容错性无法同时满足,只能在三者之间做出权衡。 13. **final 方法与...
ThreadLocal的常见用途包括: 1. 存放Session用户:每个线程可以有自己的Session副本,避免了在多线程环境下对同一个Session对象的并发访问。 2. 存放上下文变量:如WebWork的ActionContext,可以在线程内存储请求...
- **反射机制**:了解反射的用途,如动态创建对象、修改类属性等。 - **IO/NIO**:理解输入输出流的工作原理,以及NIO(非阻塞I/O)的特性。 - **注解(Annotation)**:了解注解的定义、使用和处理方式。 在...
然而,使用ThreadLocal时需要注意内存泄露的风险,特别是使用静态ThreadLocal变量时,更应该在业务代码结束前显式地调用remove方法来清理资源。 在返回成对结果的场景中,文档提到了使用Pair类的两种用途。第一种是...
ThreadLocal类的用途与使用 `ThreadLocal`类提供了线程级别的局部变量。它为每个使用该变量的线程提供了独立的变量副本,使得每个线程修改副本时不会影响到其他线程的副本。这对于解决线程安全问题特别有用,尤其...
6.3 ThreadLocal:了解ThreadLocal的用途,如何使用它解决线程间数据隔离的问题。 七、反射机制 7.1 反射概述:理解反射的概念,以及如何通过反射动态调用方法和访问字段。 7.2 构造器、方法和字段的反射:学习...
Java作为一种多用途的编程语言,其多线程功能强大,能够处理复杂的并发任务。然而,多线程编程中往往伴随着线程安全问题,如果不妥善处理,可能会导致程序崩溃或数据不一致。本实践主要探讨如何在Java中实现基于HTTP...
1. **线程局部变量ThreadLocal**:讲解ThreadLocal类的用途及其如何帮助减少内存开销并简化代码编写。 2. **不可变对象**:解释为什么使用不可变对象可以提高并发程序的性能,并给出如何创建不可变对象的建议。 3....
* volatile和ThreadLocal的使用场景和原理 * synchronized和volatile的区别 * 模拟死锁场景和原子性与可见性 二、JVM相关 * JVM内存模型和GC机制 * GC的两种类型: Minor GC和Full GC * JVM里的classloader和双亲...
给线程设置名称有助于在调试和监控过程中识别线程的用途。Java中的`Thread`类提供了`setName()`方法来设定线程名称。创建线程时,可以通过构造函数传递名称,或者在创建后单独设置。 2. **响应线程中断**: 当...
6. **ThreadLocal**:ThreadLocal为每个线程创建局部变量副本,提供线程安全的数据存储。 7. **聚簇索引与非聚簇索引**:聚簇索引决定了数据行在表中的物理顺序,而非聚簇索引则独立于数据行存储,通常用于快速查找...
4. **ThreadLocal**:ThreadLocal为每个线程提供了独立的变量副本,避免了多线程环境下共享数据的冲突。 5. **泛型**:泛型提供编译时类型安全,允许在类、接口和方法中声明类型参数,提高了代码的复用性。 6. **...
- **使用ThreadLocal**:通过`ThreadLocal`类来为每个线程提供独立的副本,从而避免共享资源的竞争。 综上所述,理解Web服务器、应用服务器和Web容器的概念及其之间的关系,掌握Servlet的工作原理,以及熟悉...
- **ThreadLocal**:每个线程都有自己的ThreadLocal变量副本,避免线程间的数据共享,可能导致内存泄漏(OOM)。 14. **线程池** - **线程池原理**:线程池预先创建一组线程,复用这些线程以提高效率,避免频繁...