[b]静态类:[/b]
[color=red]只有嵌套类才能被声明为static类[/color]。一般顶级类不能被声明为static类,可以有static变量、方法。
[b]静态方法:[/b]
不需要实例化类就能访问类的静态方法。
[b]静态变量、实例变量:[/b]
[b]静态变量(又名类变量)[/b]在[color=red]内存中只有一个[/color],java虚拟机[color=red]在加载类的过程中为静态变量分配内存[/color],静态变量位于方法区,[color=red]被类的所有实例共享[/color]。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
[b]实例变量[/b][color=red]取决于类的实例[/color]。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
[b]线程本地变量[/b]:
提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为[color=red]访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量[/color],它独立于变量的初始化副本。
[b]分析:[/b]
ThreadLocal是一个类,而且是java.lang下的,所以可以直接使用,而不用专门去import。
ThreadLocal类里有一个map结构,这个map的key是Thread对象,而value则是Object类型。这就是说,我们可以利用这个map存储任何对象。ThreadLocal提供了,set(Object o)和get()方法。set(Object o)用于往自己的map结构类添加对象,而get()则是从map中取对象。那么为什么没有key这个参数呢,set(Object o)和get()方法,为key这样赋值,[color=blue]key = Thread.CurrentThred()[/color]。所以set(Object object)和get()方法都没有key这个参数。这种机制保证了每个当前线程都可以有自己的一个key-value的值对存储在ThreadLocal中。
[b]静态线程本地变量[/b]:
和一般的静态变量一样,在内存中只有一个。它和实例线程本地变量具有相同的行为。但是实例线程本地变量不能被静态方法访问,而静态线程本地变量可以被静态方法访问!
[color=blue]非静态线程本地变量对应Per Thread - Per Instance,静态线程本地变量对应:Per Thread。[/color]
singleton单例Class中的非静态线程本地变量的效果 = 非单例Class中的静态线程本地变量。本质上,在内存中都只存在一个变量,这个变量里面为每个关联的线程保存一份相互独立的值(每个线程都有自己的一份实例值【T 的实例】,并且线程之间的值相互独立)。
[b]例子[/b]:
上面的代码会产生一个静态、引用型变量myThreadLocal,但是会有很多Integer实例,每个实例关联到一个访问这个静态变量的线程。实际上,看起来就是一个特殊的静态变量,里面对每个线程都保存一个指定类型的实例变量。
[url=http://www.coderanch.com/t/520115/threads/java/ThreadLocal-variable-static-TL-variable]ThreadLocal variable and static TL variable[/url]
[color=red]只有嵌套类才能被声明为static类[/color]。一般顶级类不能被声明为static类,可以有static变量、方法。
[b]静态方法:[/b]
不需要实例化类就能访问类的静态方法。
[b]静态变量、实例变量:[/b]
[b]静态变量(又名类变量)[/b]在[color=red]内存中只有一个[/color],java虚拟机[color=red]在加载类的过程中为静态变量分配内存[/color],静态变量位于方法区,[color=red]被类的所有实例共享[/color]。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
[b]实例变量[/b][color=red]取决于类的实例[/color]。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
[b]线程本地变量[/b]:
提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为[color=red]访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量[/color],它独立于变量的初始化副本。
[b]分析:[/b]
ThreadLocal是一个类,而且是java.lang下的,所以可以直接使用,而不用专门去import。
ThreadLocal类里有一个map结构,这个map的key是Thread对象,而value则是Object类型。这就是说,我们可以利用这个map存储任何对象。ThreadLocal提供了,set(Object o)和get()方法。set(Object o)用于往自己的map结构类添加对象,而get()则是从map中取对象。那么为什么没有key这个参数呢,set(Object o)和get()方法,为key这样赋值,[color=blue]key = Thread.CurrentThred()[/color]。所以set(Object object)和get()方法都没有key这个参数。这种机制保证了每个当前线程都可以有自己的一个key-value的值对存储在ThreadLocal中。
[b]静态线程本地变量[/b]:
和一般的静态变量一样,在内存中只有一个。它和实例线程本地变量具有相同的行为。但是实例线程本地变量不能被静态方法访问,而静态线程本地变量可以被静态方法访问!
[color=blue]非静态线程本地变量对应Per Thread - Per Instance,静态线程本地变量对应:Per Thread。[/color]
singleton单例Class中的非静态线程本地变量的效果 = 非单例Class中的静态线程本地变量。本质上,在内存中都只存在一个变量,这个变量里面为每个关联的线程保存一份相互独立的值(每个线程都有自己的一份实例值【T 的实例】,并且线程之间的值相互独立)。
[b]例子[/b]:
static ThreadLocal<Integer> myThreadLocal = new ThreadLocal<Integer>();
上面的代码会产生一个静态、引用型变量myThreadLocal,但是会有很多Integer实例,每个实例关联到一个访问这个静态变量的线程。实际上,看起来就是一个特殊的静态变量,里面对每个线程都保存一个指定类型的实例变量。
[url=http://www.coderanch.com/t/520115/threads/java/ThreadLocal-variable-static-TL-variable]ThreadLocal variable and static TL variable[/url]