ThreadLocal的疑问? 本帖最后由 fangmingshijie 于 2014-04-02 09:04:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在6之前你没有将name保存到线程的account对象里 基本上原因就是ThreadLocal中set的对象只能为本线程所看见,不能被其他线程看见对于上面的代码,Account实例化时,成员name.set()的对象只能被main线程取出,而后面的线程甲、乙并不能获取到该Account对象的成员name中set的对象,所以并不会有什么name中存放对象的副本什么的。 否则如果能看见这个被set的对象,就意味着甲乙线程能看见这个对象的引用,那么当修改对象时,就不能实现甲乙分别设置了一个name,这与ThreadLocal的设计是违背的。 三楼是对的threadlocal奥妙在此 ThreadLocal可以理解为一个Map<Thread_ID,Value>,实例化Account时相当于 Map.put(主线程_Id,"初始名");线程甲启动后,在循环输出中name.getName相当于 return Map.get(线程甲_Id),故返回值为null。希望可以帮到你 什么情景下使用ThreadLocal比较好?什么情景下使用同步比较好啊? public T get()返回此线程局部变量的当前线程副本中的值。如果变量没有用于当前线程的值,则先将其初始化为调用 initialValue() 方法返回的值。 返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。 该实现返回 null;如果程序员希望线程局部变量具有 null 以外的值,则必须为 ThreadLocal 创建子类,并重写此方法。通常将使用匿名内部类完成此操作。 +1创建匿名内部类覆盖它的 initialValue() 方法返回一个默认值就好了,只要你觉得有默认值是设计要求的就可以这么做,多数时候并不需要默认值。 java本地接口 jni的问题 java代码如何获取今天最早的时间 Pattern pt = Pattern.compile(":\\/{2}|@");正则表达式什么意思 一个复杂的算法 comparable和Comparator区别,怎么用?望高手指教. 拜个早年:祝工作顺利!麻烦大家帮我看下我写的这个java连接数据库类哪错了——? 晕死了,classpath 设置问题(急) 在vj++中如何加载一张图片? JAVA白痴问题 20分白给 applet通讯问题 idea怎么在醒目里面引用包 进程与线程的一个简单解释
对于上面的代码,Account实例化时,成员name.set()的对象只能被main线程取出,而后面的线程甲、乙并不能获取到该Account对象的成员name中set的对象,所以并不会有什么name中存放对象的副本什么的。
实例化Account时相当于
Map.put(主线程_Id,"初始名");
线程甲启动后,在循环输出中name.getName相当于
return Map.get(线程甲_Id),故返回值为null。
希望可以帮到你
返回此线程局部变量的当前线程的“初始值”。线程第一次使用 get() 方法访问变量时将调用此方法,但如果线程之前调用了 set(T) 方法,则不会对该线程再调用 initialValue 方法。通常,此方法对每个线程最多调用一次,但如果在调用 get() 后又调用了 remove(),则可能再次调用此方法。
该实现返回 null;如果程序员希望线程局部变量具有 null 以外的值,则必须为 ThreadLocal 创建子类,并重写此方法。通常将使用匿名内部类完成此操作。
+1创建匿名内部类覆盖它的 initialValue() 方法返回一个默认值就好了,只要你觉得有默认值是设计要求的就可以这么做,多数时候并不需要默认值。