2015-05-12 42 views
2

當一個線程正常工作在變量保持它的本地緩存時ThreadLocal的用途是什麼?什麼是ThreadLocal的使用?

這意味着即使沒有使用ThreadLocal,thread1也不知道thread2中相同var的值。

+0

Java語言中沒有「本地緩存」。 (「cache」是一個實現細節,不屬於語言本身的一部分。)本地_variables_僅存在於Java方法的_activation records中。當某個線程t調用方法m時,會在線程的_call stack_上激活一條激活記錄。激活記錄包含方法的所有局部變量和參數,並且當方法返回時,激活記錄從堆棧彈出(即被銷燬)。每個線程都有自己的調用堆棧,所以沒有線程可以看到屬於另一個線程的激活記錄。 –

回答

3

線程沒有保持變量在其本地緩存 - 它只是它的允許來,除非你告訴它,否則。

所以:

  • 如果你想線程與其他線程共享的狀態,你必須使用某種形式(包括​​塊,volatile變量等)的同步。
  • 如果你想阻止一個線程與其他線程共享其狀態,你必須使用ThreadLocal(假設持有該變量的對象已知多個線程 - 如果不是,那麼一切都是線程本地無論如何!)。
+1

Re,_​​如果你想阻止線程與其他線程共享狀態,你有_to use_'ThreadLocal':這是不正確的。還有其他更好的方法讓線程保持其自己的狀態不受其他線程的影響。 'ThreadLocal'適用於你需要一個_scope_是全局變量,但_extent_僅限於一個線程的變量的情況。我說「應該是罕見的」,因爲全局變量應該是罕見的,不管它們是否是線程本地的。 –

+0

@jameslarge這是一個很好的證明,以明確 - 這是我的意思是在括號中的「承擔」條款。 – yshavit

6

對於多線程,雖然您必須確保讀取變量的「最近期」值,但您希望每個實例都有效一個變量(假設我們在此討論實例字段) 。除非你小心,否則你可能會讀取一個過時的值,但基本上你有一個變量。

隨着ThreadLocal,你明確想要每個線程讀取變量一個值。這通常是爲了上下文的緣故。例如,具有某個身份驗證層的Web服務器可能會在請求處理的早期設置線程局部變量,以便該請求執行過程中的任何代碼都可以訪問身份驗證詳細信息,而不需要對上下文對象進行任何明確的引用。只要所有的處理都是在一個線程上完成的,那就是只有這個線程所做的事情,你沒事。

1

這是線程本身的全局變量,以便線程中運行的任何代碼都可以直接訪問它。 (一個「真正的」全局變量可以通過運行在「進程」中的任何代碼來訪問;我們可以稱之爲ProcessLocal :)

全局變量是否壞?也許;如果可以的話,應該避免。但有時我們沒有選擇,我們無法通過方法參數傳遞對象,並且ThreadLocal在許多設計中證明是有用的,而不會造成太多麻煩。

0

ThreadLocal的使用是指對象不是線程安全的,但您希望避免同步訪問。所以每個線程都將數據存儲在自己的Thread本地存儲內存中。默認情況下,數據在線程之間共享。