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);  
        }  
    }  

    源码解释

  • 相关阅读:
    Unix配置定时执行任务
    在Mac上使用Make编译时出现clang: error: unsupported option '-fopenmp'的解决办法
    git的一些操作
    Github误上传多余的文件夹后解决办法
    Ubuntu18.04安装使用YOLOv3
    本地IDEA中使用Spark直连集群上的Hive
    如何利用dokcer提交我的比赛代码
    Activiti7之整合spring和spring boot
    Activiti7之网关
    Activiti7之组任务
  • 原文地址:https://www.cnblogs.com/cing/p/9033056.html
Copyright © 2011-2022 走看看