JDK 1.6文档显示了有关如何使用LocalThread<T>的示例。我将其复制并粘贴到此处:

例如,下面的类生成每个线程本地的唯一标识符。线程的ID是在第一次调用UniqueThreadIdGenerator.getCurrentThreadId()时分配的,在以后的调用中保持不变。

 import java.util.concurrent.atomic.AtomicInteger;

 public class UniqueThreadIdGenerator {
     private static final AtomicInteger uniqueId = new AtomicInteger(0);
     private static final ThreadLocal <Integer> uniqueNum =
         new ThreadLocal <Integer> () {
             @Override
             protected Integer initialValue() {
                 return uniqueId.getAndIncrement();
         }
     };

     public static int getCurrentThreadId() {
         return uniqueId.get();
     }
 } // UniqueThreadIdGenerator


我的问题是:

当多个线程调用UniqueThreadIdGenerator.getCurrentThreadId()时,由于没有初始化,它仅返回0。不应该是这样的:

public static int getCurrentThreadId() {
    return uniqueNum.get();
}


现在,在第一次调用之后,它将初始化变量。

最佳答案

是的,应该为uniqueNum.get()JDK 7 docs正确使用并使用更好的名称:

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadId {
    // Atomic integer containing the next thread ID to be assigned
    private static final AtomicInteger nextId = new AtomicInteger(0);

    // Thread local variable containing each thread's ID
    private static final ThreadLocal<Integer> threadId =
        new ThreadLocal<Integer>() {
            @Override protected Integer initialValue() {
                return nextId.getAndIncrement();
        }
    };

    // Returns the current thread's unique ID, assigning it if necessary
    public static int get() {
        return threadId.get();
    }
}


但是,这实际上并不是初始化问题,而仅仅是完全使用错误的成员的问题。即使许多代码在原始代码中使用了uniqueNumgetCurrentThreadId()始终将返回“要分配的下一个ID”,而不是“为当前线程分配的ID”。

08-28 19:42