多线程访问同一个共享变量特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时,为了保证线程安全,一般使用者在访问共享变量时进行适当的同步。如图所示
同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这就显然加重了使用者的负担,那么有没有一种方式可以做到,当创建一个变量后,每个线程对其进行访问的时候访问的是自己线程的变量呢?ThreadLocal他可以,虽然他不是为了解决这个问题出现的。
ThreadLocal是JDK包所提供的,它提供了线程本地变量,也就是说你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本,当多个线程进行同时操作时,实际上也是访问的是自己本地内存里面的变量,从而避免了线程安全问题,创建一个ThreadLocal变量后,每个调用线程都会复制一个备份到自己的本地内存,如图所示。
本案例开启两个线程,在每个线程内部设置了本地线程变量,然后调用print函数打印当前本地变量值,打印后调用remove方法删除本地内存变量,代码如下:
public class ThreadLocalExample1 {
// (1) 创建ThreadLocal变量
static ThreadLocal<String> localVariable = new ThreadLocal<>();
// (2)print函数
static void print(String str){
// 打印当前线程本地内存中localVariable变量的值
System.out.println(str + ":" + localVariable.get());
// 2.1 清楚当前线程本地内存变量
// localVariable.remove();
}
public static void main(String[] args) {
// (3) 创建线程one
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
// 设置threadOne中的本地变量localVariable的值
localVariable.set("threadOne local variable");
// 调用打印函数
print("threadOne");
System.out.println("threadOne remove after" + localVariable.get());
}
});
// 创建线程two
Thread threadTwo = new Thread(new Runnable() {
@Override
public void run() {
// 设置threadTwo线程中的本地线程变量
localVariable.set("threadTwo local variable");
// 调用打印函数
print("threadTwo");
// 打印本地线程变量
System.out.println("threadTwo remove after" + ":" + localVariable.get());
}
});
// (5)启动线程
threadOne.start();
threadTwo.start();
}
}
运行结果如下:
代码(1) 创建了一个ThreadLocal变量。
代码(3)和(4)创建了两个线程
代码(5) 启动两个线程
线程one中通过set方法设置了localvariable的值,这其实设置的就是线程one本地内存中的一个副本,这个副本线程Two是访问不了的,然后调用了print函数,通过get方法获取到了当前线程one本地内存中的localVariable的值。
线程Two的执行与one相似。
打开2.1的注释后,再次运行,看下执行结果:
ThreadLocal的基本使用就到这里了,下节说实现原理
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。