java静态类、静态方法、静态变量、实例变量、线程本地变量、静态线程本地变量...

[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]:

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值