當一個線程正常工作在變量保持它的本地緩存時ThreadLocal的用途是什麼?什麼是ThreadLocal的使用?
這意味着即使沒有使用ThreadLocal,thread1也不知道thread2中相同var的值。
當一個線程正常工作在變量保持它的本地緩存時ThreadLocal的用途是什麼?什麼是ThreadLocal的使用?
這意味着即使沒有使用ThreadLocal,thread1也不知道thread2中相同var的值。
線程沒有有保持變量在其本地緩存 - 它只是它的允許來,除非你告訴它,否則。
所以:
volatile
變量等)的同步。ThreadLocal
(假設持有該變量的對象已知多個線程 - 如果不是,那麼一切都是線程本地無論如何!)。Re,_如果你想阻止線程與其他線程共享狀態,你有_to use_'ThreadLocal':這是不正確的。還有其他更好的方法讓線程保持其自己的狀態不受其他線程的影響。 'ThreadLocal'適用於你需要一個_scope_是全局變量,但_extent_僅限於一個線程的變量的情況。我說「應該是罕見的」,因爲全局變量應該是罕見的,不管它們是否是線程本地的。 –
@jameslarge這是一個很好的證明,以明確 - 這是我的意思是在括號中的「承擔」條款。 – yshavit
對於多線程,雖然您必須確保讀取變量的「最近期」值,但您希望每個實例都有效一個變量(假設我們在此討論實例字段) 。除非你小心,否則你可能會讀取一個過時的值,但基本上你有一個變量。
隨着ThreadLocal
,你明確想要每個線程讀取變量一個值。這通常是爲了上下文的緣故。例如,具有某個身份驗證層的Web服務器可能會在請求處理的早期設置線程局部變量,以便該請求執行過程中的任何代碼都可以訪問身份驗證詳細信息,而不需要對上下文對象進行任何明確的引用。只要所有的處理都是在一個線程上完成的,那就是只有這個線程所做的事情,你沒事。
這是線程本身的全局變量,以便線程中運行的任何代碼都可以直接訪問它。 (一個「真正的」全局變量可以通過運行在「進程」中的任何代碼來訪問;我們可以稱之爲ProcessLocal :)
全局變量是否壞?也許;如果可以的話,應該避免。但有時我們沒有選擇,我們無法通過方法參數傳遞對象,並且ThreadLocal在許多設計中證明是有用的,而不會造成太多麻煩。
ThreadLocal
的使用是指對象不是線程安全的,但您希望避免同步訪問。所以每個線程都將數據存儲在自己的Thread本地存儲內存中。默認情況下,數據在線程之間共享。
Java語言中沒有「本地緩存」。 (「cache」是一個實現細節,不屬於語言本身的一部分。)本地_variables_僅存在於Java方法的_activation records中。當某個線程t調用方法m時,會在線程的_call stack_上激活一條激活記錄。激活記錄包含方法的所有局部變量和參數,並且當方法返回時,激活記錄從堆棧彈出(即被銷燬)。每個線程都有自己的調用堆棧,所以沒有線程可以看到屬於另一個線程的激活記錄。 –