2011-10-19 27 views
0

JDK 1.6文檔顯示有關如何使用LocalThread<T>的例子。我複製並粘貼到此處:ThreadLocal的<T>文檔在JDK

例如,下面的類生成本地的每個線程的唯一標識符。線程的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(); 
} 

現在在第一次調用後,它會去初始化變量。

+1

代替生成一個唯一的ID,你可以使用的唯一的ID每個線程都有了。 '長ID = Thread.currentThread()的getId();' –

回答

5

是的,它應該是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」。

+0

或許一個也應該重寫的ThreadLocal的'set'和'remove'方法和拋出[UnsupportedOperationException異常](http://docs.oracle.com/javase /7/docs/api/java/lang/UnsupportedOperationException.html)。只是一個想法。 –