Java线程学习笔记之线程局部变量

ThreadLocal

该类提供了线程局部变量。这些变量不同于它们的普通对应物,访问某个变量(通过get和set方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。即每个线程访问的是该变量的一个副本。在这个副本中,线程可以更改该变量的值,变量的初始化值不会改变,其他的副本亦不会改变。所以说,ThreadLocal存放的值是线程内共享的,线程间互斥的。类的其他方法请参考API。下面是一个实例:

import java.util.Random;

public class ThreadLocalTest {
    /**创建一个线程本地变量*/
    private static final ThreadLocal tl = new ThreadLocal(){
        @Override
        protected Integer initialValue() {
            return 100;//设置其初始化值为100,否则会返回null
        }
    };
    public static void main(String[] args){
        /**创建线程*/
        for(int i=0; i<10; i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("线程:"+Thread.currentThread().getName()+" 第1次取值:"+tl.get());
                    Integer tmp = new Random().nextInt(100);
                    System.out.println("线程:"+Thread.currentThread().getName()+" 设置新值:"+tmp);
                    tl.set(tmp);//为此线程局部变量的当前线程副本中的值设置新值
                    System.out.println("线程:"+Thread.currentThread().getName()+" 第2次取值:"+tl.get());
                }
            }).start();
        }
    }
}

结果:

线程:Thread-01次取值:100
线程:Thread-71次取值:100
线程:Thread-91次取值:100
线程:Thread-0 设置新值:34
线程:Thread-11次取值:100
线程:Thread-21次取值:100
线程:Thread-2 设置新值:19
线程:Thread-31次取值:100
线程:Thread-51次取值:100
线程:Thread-5 设置新值:78
线程:Thread-52次取值:78
线程:Thread-41次取值:100
线程:Thread-61次取值:100
线程:Thread-6 设置新值:23
线程:Thread-62次取值:23
线程:Thread-4 设置新值:78
线程:Thread-42次取值:78
线程:Thread-3 设置新值:38
线程:Thread-32次取值:38
线程:Thread-22次取值:19
线程:Thread-1 设置新值:73
线程:Thread-12次取值:73
线程:Thread-02次取值:34
线程:Thread-7 设置新值:99
线程:Thread-9 设置新值:57
线程:Thread-92次取值:57
线程:Thread-81次取值:100
线程:Thread-8 设置新值:96
线程:Thread-82次取值:96
线程:Thread-72次取值:99

这段代码主要是为了说明ThreadLocal在其他线程中的用的是它的副本,且各个线程的副本之间相互独立,互不影响。利用它,我们可以实现线程内共享一些数据,避免通过参数来传递。比如用ThreadLocal存放Connection。

** 
 * 数据库连接管理类 
 * @author 爽 
 * 
 */  
public class ConnectionManager {  

    /** 线程内共享Connection,ThreadLocal通常是全局的,支持泛型 */  
    private static ThreadLocal threadLocal = new ThreadLocal();  

    public static Connection getCurrConnection() {  
        // 获取当前线程内共享的Connection  
        Connection conn = threadLocal.get();  
        try {  
            // 判断连接是否可用  
            if(conn == null || conn.isClosed()) {  
                // 创建新的Connection赋值给conn(略)  
                // 保存Connection  
                threadLocal.set(conn);  
            }  
        } catch (SQLException e) {  
            // 异常处理  
        }  
        return conn;  
    }  

    /** 
     * 关闭当前数据库连接 
     */  
    public static void close() {  
        // 获取当前线程内共享的Connection  
        Connection conn = threadLocal.get();  
        try {  
            // 判断是否已经关闭  
            if(conn != null && !conn.isClosed()) {  
                // 关闭资源  
                conn.close();  
                // 移除Connection  
                threadLocal.remove();  
                conn = null;  
            }  
        } catch (SQLException e) {  
            // 异常处理  
        }  
    }  
}  

本文参考自:Java线程(篇外篇):线程本地变量ThreadLocal

你可能感兴趣的:(Java,线程)