关于Java的ThreadLocal网上有大量的文章在谈这个问题,为什么这个东西大家说来说去乐此不疲呢,大约是因为它本身的神秘性,经常出现在一些框架中,但是自己又很少用。亦或是因为大家本身对它的理解各有偏颇,所以成了大家热议的话题。
我对ThreadLocal的理解也不深,这篇文章也不会去做什么深层次的研究,对源码分析的文章也有很多写的非常好的,我只是想从另外一个角度去认识ThreadLocal。
ThreadLocal被翻译成“线程本地变量”,从名字上讲首先它是“
变量”,那么,我们就来看看Java中的各种变量。
一、局部变量
定义:方法中,代码块中,方法参数中定义的变量。
作用域:方法内部,代码块内部。其他方法,其他代码块不能访问。
生命周期:方法或者代码块调用开始到方法或者代码块调用结束。
共享性:方法内部,代码块内部共享,对于多个线程来讲,变量初始化到自己的工作内存中,主内存不存在该变量,所以线程之间不共享。
例子:
public void method1() {
//方法执行到此处时变量a才被创建。
int a=1;
for (int i=0; i<10; i++) {
System.out.println(i);
}
if (true) {
int i= 2;
}
{
int i=3;
}
}
public void method2() {
int a=2;
}
同一个类中的method1和method2中都可以定义一个名为a的变量,同样method1中的for代码块,if代码块和{}代码块中都可以定义名为i的变量。它们的作用域都在方法内部或者代码块内部。
二、成员变量
定义:成员变量又称为成员属性,它是描述对象状态的数据,是类中很重要的组成成分。
作用域:整个类实例内部。
生命周期:伴随整个类实例始终,变量在创建类实例时被创建。
共享性(同一个类实例):在整个类实例共享,对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,线程之间共享一个主内存变量,存在线程安全问题。
例子:
public class Clazz {
private int a;
public void method() {
a ++;
}
}
对于同一个Clazz类的实例来讲,变量a的作用域存在于整个Clazz实例,如果多线程之间共享一个Clazz实例,变量a是存在线程安全问题的。
三、全局变量
定义:全局变量在Java中也可以叫静态变量,通过static关键字修饰。
作用域:整个类。
生命周期:伴随整个类始终,变量在第一次使用该类时被创建。
共享性:在整个类共享,对于多线程来讲,变量被初始化到主内存中,每个线程拷贝变量到工作内存中进行操作,线程之间共享一个主内存变量,存在线程安全问题。
public class Clazz {
public static int a = 0;
}
说了这么多,那么跟ThreadLocal有什么关系呢?
思考为什么要定义这么多的变量类型呢?
局部变量解决了方法内部,代码块内部
行之间的变量传递问题。如果没有局部变量,不知道行之间怎么传递变量。
成员变量解决了类实例各
方法之间的变量传递。如果没有成员变量,方法之间变量传递只能靠参数。
全局变量解决了
类之间的变量传递。如果没有全局变量,类之间变量只能靠构造实例的时候相互传递。
那么ThreadLocal也是变量,该变量解决了什么问题呢?
ThreadLocal解决了变量在
同一个线程内部之间的传递。
ThreadLocal首先不是解决线程安全问题,最显而易见的原因是ThreadLocal内部保存的变量在多线程之间不共享。
数据都不共享,谈何线程安全?当然了,
如果ThreadLocal内部保存的变量本身就是一个多线程共享的数据,那么还是会有线程安全的问题的。如果没有ThreadLocal,我们需要在同一个线程之内共享的数据大约只能通过方法传递了。这样可能会让代码显得杂乱。
四、ThreadLocal变量
定义:线程本地变量。
作用域:线程内部。
生命周期:伴随线程执行始终,线程结束,变量生命结束。
共享性:多个线程之间不共享。
分享到:
相关推荐
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
java 简单的ThreadLocal示例
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
深入研究java.lang.ThreadLocal类。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是 threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
Java中ThreadLocal的设计与使用.doc
主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下
我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用...
正确理解ThreadLocal.pdf
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
主要为大家详细介绍了java ThreadLocal的使用案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal ;Java资料—详解ThreadLocal Java资料—详解ThreadLocal
NULL 博文链接:https://justsee.iteye.com/blog/791919
声明仅作学习。如有不适,请告知。清晰的看到一个线程Thread中存在一个ThreadLocalMap,ThreadLocalMap中的key对应ThreadLo
利用过滤器去获取request和response,进行将其设置到ThreadLocal从而保证我的请求的安装线,这样就能在java普通类中获取request和response
ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。使用这个工具类可以很简洁地编写出优美的多线程程序。接下来通过本文给大家介绍Java中的ThreadLocal,需要的朋友可以参考下
Java中ThreadLocal工具类(解决多线程程序中并发问题的一种新思路,主要为参数的拷贝问题),感兴趣的话可以查看博文,博文地址:http://blog.csdn.net/otengyue/article/details/38459327