ThreadLocal浅解
- ThreadLocal的基本理解
Threadlocal很多地方都叫线程本地变量,也有很多地方叫线程本地存储,个人理解在业务上方法调用方法时都是在单线程中进行操作,在进行访问数据库时牵扯到事务操作时,因为要求要做到事务的start transaction()和commit()操作都需要同一个connection来执行,而恰巧我们的connection是从线程池中调用的。因此,我们不能保证我们进行事务开启和提交时都是用的相同的connection对象,在MVC三层架构中,一个层的方法调用另一个层的方法,难免会产生错误,比如数据库的脏读、不一致读等等,因此这里有两个解决办法。
①将connection对象作为参数传递给方法,这样就可以保证每次调用的connection对象都是一致的,但是个人觉得,这样就违背了面向对象的封装理念,同时代码也显得很臃肿,下面给出另一种解决办法,也就是用到了我们的ThreadLocal。
②private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
ThreadLoacl是一个类似Map的数据结构,key是当前的线程名称,value是当前的connection对象。由于ThreadLocal本身实现了自动封装,因为当前线程名称是固定的,所以对应的一个key仅有一个connection对象与之对应。
我