文章出處
文章列表
如果定義了一個單實例的java bean,它有若干屬性,但是有一個屬性不是線程安全的,比如說HashMap。并且碰巧你并不需要在不同的線程中共享這個屬性,也就是說這個屬性不存在跨線程的意義。那么不推薦使用sychronize,可使用ThreadLocal
關鍵代碼如下:
package cn.happy.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class ThreadUtil { // 初始化一個ThreadLocal對象 private static final ThreadLocal sessionTL = new ThreadLocal(); private static Configuration configuration; private final static SessionFactory sessionFactory; static { try { configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } public static Session currentSession() { //sessionTL的get()方法根據當前線程返回其對應的線程內部變量, //也就是我們需要的Session,多線程情況下共享數據庫連接是不安全的。 //ThreadLocal保證了每個線程都有自己的Session。 Session session = (Session) sessionTL.get(); // 如果session為null,則打開一個新的session if (session == null) { //創建一個數據庫連接對象session。 session = sessionFactory.openSession(); // 保存該數據庫連接session到ThreadLocal中。 sessionTL.set(session); } //如果當前線程已經訪問過數據庫了, //則從sessionTL中get()就可以獲取該線程上次獲取過的數據庫連接對象。 return session; } /** * 關閉Session */ public static void closeSession(){ Session session = (Session) sessionTL.get(); sessionTL.set(null); session.close(); } }
①初始化一個ThreadLocal對象,該對象有get()、set()方法
②sessionTL的get()方法根據當前線程返回其對應的線程內部變量 也就是我們需要的Session,多線程情況下共享數據庫連接是不安全的。 ThreadLocal保證了每個線程都有自己的Session。
③ 如果該線程是初次訪問,session是NULL,則創建一個Session對象
④創建一個Session對象,保存該對象到ThreadLocal中
⑤ 如果當前線程已經訪問過數據庫,則從SessionTL中get()就可以獲取該線程上次獲取過得Session對象
⑥關閉Session,通過ThreadLocal類,既實現了多線程并發,同時,也實現了Singleton單例模式
文章列表
全站熱搜