1. 程式人生 > >hibernate中session線程安全的實現

hibernate中session線程安全的實現

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線程安全的實現