答复: 简明扼要,再谈ThreadLocal和synchronized

[quote="rehte"][quote="linliangyi2007"] 楼上的,对纵向的理解是不对的。变量x对于线程而言是安全的,而非不安全的。如果X是java的原生类型,则在每个线程中存在的是X的值副本;如果X是对象类型,那么每个线程中的对象引用也是不同的,因为对方法中的X的值改变,只影响当前X的引用(或者说指针的指向),不会影响其他线程的副本值,这也是所谓副本的含义。你可以做个实验。 [/quote] 当x是对象类型时,X必须是逃逸型引用,而不能是非逃逸型引用,即X是通过在本地方法中产生的,这就是所谓local的含义。如果X是非逃逸型的,则仍然有同步问题。比如: [code] class A{ private Object v; public A(){ v=new Object(); } public ThreadLocal method1(){ ThreadLocal local=new ThreadLocal(); local.set(v); //对象v是非逃逸型引用,这儿的local所引用的对像是非同步安全的 return local; } public ThreadLocal method2(){ ThreadLocal local = new ThreadLocal(); local.set(new Object()); //这儿的值是逃逸类型的,因此local是同步安全的 return local; } public void methodUseLocal(){ ThreadLocal local1=method1(); Object tempv1=local1.get(); //这儿的tempv1其实就是this.v,因此是非线程安全的 //... ThreadLocal local2=method2(); Object tempv2=local2.get(); //这儿的tempv2是线程安全的,是和当前线程绑定的变量 //... } } [/code][/quote] 楼上提醒的是。实际上,我们对于一个方法是用ThreadLocal来对本地变量进行副本的时候,大多指的是方法内部变量(请看我的示意图,X是方法内部的local varible)。要对类变量进行共享的话,不是ThreadLocal设计的目的。但确实存在这样的问题,值得大家注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值