Java并发编程-ThreadLocal

一、ThreadLocal 的理解

ThreadLocal 由 JDK 包提供,它提供了线程本地变量,如果创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量的时候,实际上是操作自己本地内存里面的变量,从而避免了线程安全问题。创建了一个 ThreadLocal 变量后,每个线程都会复制一个变量到自己的本地内存中。如图所示:

ThreadLocal01.png

二、ThreadLocal 的使用示例

代码如下:

public class ThreadLocalTest {
    
    // 创建ThreadLocal变量
    public static ThreadLocal<String> localVariable = new ThreadLocal<>();
    
    // 打印方法
    public static void print(String str) {
        // 打印当前线程本地内存中localVariable变量的值
        System.out.println(str + ":" + localVariable.get());
        // 清除当前线程本地内存中localVariable变量的值
        localVariable.remove();
    }
    
    public static void main(String[] args) {
        
        // 创建线程thread1
        Thread thread1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                // 设置线程thread1中本地变量localVariable的值
                localVariable.set("thread1 local variable");
                print("thread1");
                System.out.println("thread1 remove after" + ":" + localVariable.get()); 
            }
        });
        
        // 创建线程thread2
        Thread thread2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                // 设置线程thread2中本地变量localVariable的值
                localVariable.set("thread2 local variable");
                print("thread2");
                System.out.println("thread2 remove after" + ":" + localVariable.get());
            }
        });
        
        // 启动线程
        thread1.start();
        thread2.start();
        
    }

}

运行结果如下:

thread1:thread1 local variable
thread2:thread2 local variable
thread1 remove after:null
thread2 remove after:null

将 print() 方法中的 localVariable.remove() 注释,再次运行得到运行结果:

thread1:thread1 local variable
thread2:thread2 local variable
thread1 remove after:thread1 local variable
thread2 remove after:thread2 local variable

猜你喜欢

转载自www.cnblogs.com/shanyingwufeng/p/9942075.html