0

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();
}

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

4

1 回答 1

5

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

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();
    }
}

不过,这并不是真正的初始化问题——只是完全使用了错误的成员而已。即使在原始代码使用了很多代码,也总是会返回“下一个要分配的 ID”而不是“为当前线程分配的 ID”。uniqueNumgetCurrentThreadId()

于 2011-10-19T19:12:42.920 回答