解决方案 »

  1.   

    你的i是static的,所以会有问题啊,static的话你那三个线程会共享这个变量的,而且i++也不是原子操作的
      

  2.   

    然后就是我把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....
      

  3.   

    thread local就是每个thread都有自己存的东西。一般代码中还是尽量少用,除非实在是没有办法了。
      

  4.   

    那还是没想懂怎么Thread0会出来2,1,1这样的结果啊。。
      

  5.   

    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.