怎么实现一个线程安全类

提到线程安全,大家都想到用synchonized关键字,其实还有另一种方法,就是ThreadLocal,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
下面来看一个hibernate中典型的ThreadLocal的应用:
1.private static final ThreadLocal threadSession = new ThreadLocal();  
2.  
3.public static Session getSession() throws InfrastructureException {  
4.    Session s = (Session) threadSession.get();  
5.    try {  
6.        if (s == null) {  
7.            s = getSessionFactory().openSession();  
8.            threadSession.set(s);  
9.        }  
10.    } catch (HibernateException ex) {  
11.        throw new InfrastructureException(ex);  
12.    }  
13.    return s;  
14.}  

可以看到在getSession()方法中,首先判断当前线程中有没有放进去session,如果还没有,那么通过sessionFactory().openSession()来创建一个session,再将session set到线程中,实际是放到当前线程的ThreadLocalMap这个map中,这时,对于这个session的唯一引用就是当前线程中的那个ThreadLocalMap,而threadSession作为这个值的key,要取得这个session可以通过threadSession.get()来得到,里面执行的操作实际是先取得当前线程中的ThreadLocalMap,然后将threadSession作为key将对应的值取出

你可能感兴趣的:(线程安全)