hibernate中session線程安全的實現
阿新 • • 發佈:2017-06-22
hibernate中的session session的線程安全 threadlocal模式
在hibernate中session是使用ThreadLocal實現線程安全的。
ThreadLocal並不是一個Thread,而是一個線程副本,ThreadLocal為每個使用該變量的線程提供一個變量副本,線程修改自己的變量副本不會影響其他線程的變量副本
ThreadLocal有四個方法:
set():設置當前線程的局部變量的值
get():獲取當前線程的局部變量的值
remove():將當前線程局部變量的值刪除,此方法不必顯示的調用,因為局部變量自有垃圾回收器去清理
initialValue():返回該局部變量的初始值,只有在線程第一次調用get,set方法時,此方法才會執行
ThreadLocal源碼如下:
public class ThreadLocal { /*這個集合中以當前線程對象作為鍵,值就是該線程對象的變量副本的值,也就是 * session */ Map map = Collections.synchronizedMap(new HashMap()); public Object get(){ Thread currentThread = Thread.currentThread(); Object o = map.get(currentThread); if(o == null && !map.containsKey(currentThread)){ o = initialValue(); map.put(currentThread, o); } return o; } public void set(Object newValue){ map.put(Thread.currentThread(), newValue); } public Object initialValue() { return null; } }
hibernate中的getCurrentSession()的底層代碼如下:
public class CurrentSession { public static final ThreadLocal session = new ThreadLocal(); public static final SessionFactory sf; static { sf = new Configuration().configure().buildSessionFactory(); } public Session getCurrentSession(){ Session s = (Session) session.get(); if(s == null){ s = sf.openSession(); session.set(s); } return s; } }
總結:要想讓多線程實現對共享資源的操縱,就需要對它進行同步處理,這不是一件容易的事,不僅會降低程序性能,還要小心死鎖的產生,而ThreadLocal模式,直接讓每一個線程都具有自己的一個session,他僅僅操作自己的session不會影響其它線程的session,因此也就不需要進行同步處理
本文出自 “12212886” 博客,請務必保留此出處http://12222886.blog.51cto.com/12212886/1940749
hibernate中session線程安全的實現