读ibatis源码—为什么说SqlMapClient是线程安全的
Ibatis做为一个半自动化的Orm框架有他的缺点和优点。在这里我就不宽泛的说这些了。就说说为什么SqlMapClient是线程安全的,他是怎么实现的。
提出问题:
这是一段ibatis simple工程的代码,大家都能看明白这是一个单例,只有一个SqlMapClient对象存在,在多线程的情况下,SqlMapClient是怎么解决事务隔离呢,怎么共享资源的呢?
一、SqlMapClient是怎么被创建的
打开SqlMapClientBuilder发现buildSqlMapClien一句话
打开NodeletParser的parse方法,我们发现他就是解析xml配置文件的
最后这些文件被分门别类的放在了XmlParserState的这些属性里public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) return (T)map.get(this); // Maps are constructed lazily. if the map for this thread // doesn't exist, create it, with this ThreadLocal and its // initial value as its only entry. T value = initialValue(); createMap(t, value); return value; } public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
以上是ThreadLocal的get,set方法的源码,从中我们可以看出,我们用的ThreadLocal实质是一个map,没一个ThreadLocal变量都是一个map,key为线程Id
4 楼 tou3921 2010-01-14 很好//////
5 楼 fight_bird 2010-01-18 精神可嘉,这是线程安全的标准实现方式,但不是最高效的方式,其实iBATIS官方文档说得很清楚了。 6 楼 J-catTeam 2010-03-28 ThreadLocal的并不是起着实现线程安全的作用。使用了ThreadLocal还是会出现线程安全的问题
ThreadLocal是为了提供一个跨方法,跨类的变量副本保存。一个ThreadLocal保存一个