ThreadLocal好难啊!!!

scmod 2014-10-09 08:57:18
package com.cc;

public class ThreadLocalDemo extends Thread {



public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {

@Override

protected Integer initialValue() {

return i;

}

};

public static int i = 0;

public static void main(String[] args) {

Thread t1 = new ThreadLocalDemo();

Thread t2 = new ThreadLocalDemo();

Thread t3 = new ThreadLocalDemo();

t1.start();

t2.start();

t3.start();

}



@Override

public void run() {



for(int n=0; n<3; n++) {

i = threadLocal.get();

i++;

// threadLocal.set(i);

threadLocal.remove();

System.out.println(currentThread().getName() + " i=" + i);

}



// for(int n=0; n<3; n++) {

// i++;

// System.out.println(currentThread().getName() + " i=" + i);

// }

}


}
本来只是试下多个副本。。
结果无聊改了下initialValue返回i
然后看看remove什么效果
然后就看不懂了。。。。
结果出来各式各样
单步调试结果就正常点。
不知道为什么
Thread-2 i=1
Thread-1 i=1
Thread-0 i=1
Thread-1 i=3
Thread-2 i=2
Thread-1 i=5
Thread-0 i=4
Thread-0 i=7
Thread-2 i=6,,,,
还有这样的。。。
Thread-1 i=1
Thread-1 i=2
Thread-1 i=3
Thread-0 i=1
Thread-0 i=2
Thread-0 i=3
Thread-2 i=2
Thread-2 i=4
Thread-2 i=5
单步貌似就是下面这样 的比较正常 的。。。
Thread-2 i=1
Thread-2 i=2
Thread-0 i=3
Thread-1 i=4
Thread-1 i=5
Thread-1 i=6
Thread-2 i=7
Thread-0 i=8
Thread-0 i=9
调试出来貌似有时候还会报
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:838]
这么个东西。。。
然后,然后就不懂了。。。
怎么就各种混乱了。。。
...全文
300 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2014-10-14
  • 打赏
  • 举报
回复
ThreadLocal 的用法: 当我们希望一个线程有自己那份变量副本时我们才用它,threadLocal.get() 就只得到自己那份,好处是初始化和更新及读取过程可以在不同的方法中,彼此之间不互相传递参数,特别适应一些框架型的 API 设计,来扮演一个 Context 角色,比如 transaction context, login context, faces context, session context 之类。框架 API 会在一个请求开始时初始化 context 然后 threadLocal.set 放进去,之后各个阶段的 API 方法从 threadLocal.get() 拿到当前线程的 context,最后阶段时再 threadLocal.remove() 清除。 当我们使用 static 时就表示我们其实不需要 ThreadLocal.
scmod 2014-10-11
  • 打赏
  • 举报
回复
那还是没想懂怎么Thread0会出来2,1,1这样的结果啊。。
AndersZhuo123 2014-10-10
  • 打赏
  • 举报
回复
你的i是static的,所以会有问题啊,static的话你那三个线程会共享这个变量的,而且i++也不是原子操作的
skgary 2014-10-10
  • 打赏
  • 举报
回复
thread local就是每个thread都有自己存的东西。 一般代码中还是尽量少用,除非实在是没有办法了。
scmod 2014-10-10
  • 打赏
  • 举报
回复
引用 1 楼 Anders_Zhuo 的回复:
你的i是static的,所以会有问题啊,static的话你那三个线程会共享这个变量的,而且i++也不是原子操作的
然后就是我把remove也注释掉 出来会有这样的结果 Thread-0 i=2 n=0 Thread-0 i=1 n=1 Thread-1 i=2 n=0 Thread-0 i=1 n=2 Thread-1 i=2 n=1 Thread-1 i=2 n=2 Thread-2 i=3 n=0 Thread-2 i=3 n=1 Thread-2 i=3 n=2 照理单个线程自己输出应该不会错乱啊 怎么线程0会从2开始又变到1....

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧