zoukankan      html  css  js  c++  java
  • ThreadLocal类

    ThreadLoacl类:解决变量在不同线程间的隔离性,即不同线程拥有自己的值,不同线程中的值是可以放入ThreadLocal类中进行保存的。为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这个类使线程中的某个值与保存值的对象关联起来,提供了get与set等访问接口,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用get时设置的最新值。当某个线程初次调用ThreadLocal.get方法时,就会调用initialValue来获取初始值。从概念上看,可以将ThreadLocal<T>视为包含了Map<Thread, T>对象,其中保存了特定于该线程的值,但ThreadLocal的实现并非如此。这些特定于线程的值保存在Thread对象中,当线程终止后,这些值会作为垃圾回收。

    粗糙例子:

    public class TestDaoNew {  
        // ①使用ThreadLocal保存Connection变量  
        private static ThreadLocal<Connection> connThreadLocal = new ThreadLocal<Connection>();  
      
        public static Connection getConnection() {  
            // ②如果connThreadLocal没有本线程对应的Connection创建一个新的Connection,  
            // 并将其保存到线程本地变量中。  
            if (connThreadLocal.get() == null) {  
                Connection conn = getConnection();  
                connThreadLocal.set(conn);  
                return conn;  
            } else {  
                return connThreadLocal.get();// ③直接返回线程本地变量  
            }  
        }  
      
        public void addTopic() throws SQLException {  
            // ④从ThreadLocal中获取线程对应的Connection  
            Statement stat = getConnection().createStatement();  
        }  
    }  

    改进例子:

    public class ConnectionManager {  
      
        private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {  
            @Override  
            protected Connection initialValue() {  
                Connection conn = null;  
                try {  
                    conn = DriverManager.getConnection(  
                            "jdbc:mysql://localhost:3306/test", "username",  
                            "password");  
                } catch (SQLException e) {  
                    e.printStackTrace();  
                }  
                return conn;  
            }  
        };  
      
        public static Connection getConnection() {  
            return connectionHolder.get();  
        }  
      
        public static void setConnection(Connection conn) {  
            connectionHolder.set(conn);  
        }  
    }  

    源码解释

  • 相关阅读:
    JIT动态编译器的原理与实现之Interpreter(解释器)的实现(三)
    java工作之后需要看的书籍
    WebService 之 REST vs SOAP
    消息队列
    dreamweaver cs6 的破解方法
    jquery mobile页面跳转后js不执行的问题
    JQueryMobile页面跳转参数的传递解决方案
    HTMl5的sessionStorage和localStorage
    phoneGap、JQueryMobile 简介及中文API地址
    Android 禁止响应屏幕翻转
  • 原文地址:https://www.cnblogs.com/cing/p/9033056.html
Copyright © 2011-2022 走看看