典型实例
Hiberante的HibernateSessionFactory
package com.zoucq.stock.factory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.AnnotationConfiguration;
/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution. Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html }.
*/
public class HibernateSessionFactory {
private static String CONFIG_FILE_LOCATION = "/config/hibernate.cfg.xml";
//ThreadLocal实例
private static final ThreadLocal<Session> threadLocal =
new ThreadLocal<Session>();
private static Configuration configuration = new AnnotationConfiguration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
//静态初始化sessionFactory
static {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private HibernateSessionFactory() {
}
/**
* 获取session
* @return
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
//如果TreadLocal中不存在当前线程对应的session,就重新创建并保存
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session =
(sessionFactory != null) ? sessionFactory.openSession(): null;
threadLocal.set(session);
}
return session;
}
/**
* Rebuild hibernate session factory
*
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
//一些简单的方法就省略
}
总结
ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。ThreadLocal不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。 ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。 Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。 当然ThreadLocal并不能替代synchronized,它们处理不同的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。
分享到:
相关推荐
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
这个压缩包 "Quartz-ThreadLocal.rar" 内含的学习资源很可能是关于如何在 Quartz 调度器中结合使用 ThreadLocal 的示例。 Quartz 的核心功能包括: 1. **作业与触发器**:在 Quartz 中,任务被称为“作业”(Job)...
2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. ...
Java并发编程学习之ThreadLocal源码详析 ThreadLocal是Java并发编程中的一种机制,用于解决多线程访问共享变量的问题。它可以使每个线程对共享变量的访问都是线程安全的,使得多线程编程变得更加简单。 ...
在IT行业中,线程安全和事务管理是两个非常重要的概念,尤其在多线程环境下的分布式系统中。本文将深入探讨ThreadLocal的使用以及...通过深入学习源码和实际应用,我们可以更好地理解其工作原理,并在实践中灵活运用。
通过深入源码学习,我们可以更好地理解Spring如何在多线程环境中优雅地管理事务,以及如何利用ThreadLocal来优化并发性能。同时,了解数据库连接池的工作原理也有助于我们更好地配置和使用连接池,提升应用程序的...
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中一个非常重要的工具类,它主要用于在多线程环境中提供线程局部变量。...学习并理解ThreadLocal的原理和使用方法对于编写高效、安全的多线程Java程序至关重要。
2. **生命周期管理**:ThreadLocal变量仅存在于创建它的线程中。当线程结束时,ThreadLocal实例及其存储的值不会自动清理,因此如果长时间存在大量线程或者频繁创建销毁线程,可能会导致内存泄漏。开发者需要在不再...
2. **生命周期管理**:需要注意的是,ThreadLocal变量不会自动被垃圾回收,因为它们并不直接持有任何实际的值,而是持有线程的引用。因此,当不再需要使用ThreadLocal时,应显式调用`remove()`方法,以防止内存泄漏...
2. **ThreadLocal详解**: ThreadLocal是Java提供的一种线程局部变量,每个线程都拥有自己独立的ThreadLocal副本,互不影响。在上述代码中,创建了一个ThreadLocal实例,然后在线程的run()方法中设置值,每个线程...
2. **SessionFactory的创建**:SessionFactory是Hibernate的核心,它是线程安全的,负责管理数据库的连接和Session的创建。一般在应用启动时创建一次。 3. **ThreadLocal的使用**:在`HibernateUtil`中,可能有一个...
Java单线程ThreadLocal串值问题解决方案主要介绍了Java单线程ThreadLocal串值问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 ThreadLocal简介 ThreadLocal是Java中...
ThreadLocal是Java编程中一个非常重要的工具类,它允许我们在多线程环境下为每个线程创建独立的变量副本。在每个线程内部,ThreadLocal变量就像一个私有的局部变量,不同线程之间的副本互不干扰,确保了数据的安全性...
2. **Entry**:`ThreadLocalMap`的内部类`Entry`继承自`WeakReference<ThreadLocal<?>>`,这意味着`ThreadLocal`对象是弱引用,当没有其他强引用指向`ThreadLocal`时,它将被垃圾回收,对应的`Entry`也会在下次`...
主要介绍了Java ThreadLocal的设计理念与作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本教程“Struts2 学习 2”将深入探讨Struts2的核心概念和技术,通过一系列文档帮助你掌握这个框架的关键要点。 一、ActionContext的理解与应用 在“第九讲 ActionContext.docx”中,你将学习到ActionContext是...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
2. 多线程:掌握并发编程,理解线程状态,熟悉synchronized、volatile、ThreadLocal等关键字。 3. 文件与I/O流:学习文件操作,掌握输入输出流,理解缓冲流、转换流、对象流等。 4. 网络编程:理解TCP/IP协议,学习...
ThreadLocal 2 Enum 3 Throwable 3 Error 3 Exception 3 Class 4 ClassLoader 4 Compiler 4 System 4 Package 4 Void 4 java.util AbstractList 1 AbstractMap 1 AbstractSet 1 ArrayList 1 LinkedList 1 HashMap 1 ...