ThreadLocal(避免线程不安全问题)
什么是ThreadLocal?
线程本地变量,也有些地方叫做线程本地存储,他代表一个线程局部变量。
为什么要ThreadLocal?
如果一段代码中所需要的数据必须与其他代码共享,那就看看这些共享数据的代码能否保证在同一个线程中执行?如果能够保证,我们就可以把共享数据的可见范围限定在同一个线程之内,这样无需同步,也能够保证线程之间不出现数据的争用问题了。
面向的问题是从根本上避免多个线程对共享资源的竞争,是为了隔离多个线程的数据共享,也就不需要对多个线程进行同步了。
通过把数据放在ThreadLocal中就可以让每个线程创建一个该变量的副本。从而避免了并发访问时线程安全的问题了。
private ThreadLocal<String> name = new ThreadLocal<>();
ThreadLocal的应用场景
最常见的ThreadLocal使用场景为 用来解决数据库连接、Session管理等。如:
数据库连接:
Java代码
- private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
- public Connection initialValue() {
- return DriverManager.getConnection(DB_URL);
- }
- };
- public static Connection getConnection() {
- return connectionHolder.get();
- }
Session管理:
Java代码
- private static final ThreadLocal threadSession = new ThreadLocal();
- public static Session getSession() throws InfrastructureException {
- Session s = (Session) threadSession.get();
- try {
- if (s == null) {
- s = getSessionFactory().openSession();
- threadSession.set(s);
- }
- } catch (HibernateException ex) {
- throw new InfrastructureException(ex);
- }
- return s;
- }